Утечка памяти Python при многопроцессорной обработкеPython

Программы на Python
Ответить
Гость
 Утечка памяти Python при многопроцессорной обработке

Сообщение Гость »

Я работаю над некоторыми вычислениями на Python с использованием многопроцессорности (concurrent.futures), однако я заметил, что происходит некоторая утечка памяти. Похоже, что память, используемая подпроцессами, не освобождается после завершения вычислений подпроцесса, я приложил упрощенный пример. Я делаю что-то не так или это ошибка в Python? Я протестировал Python3.6 и Python3.8. Любое предложение о том, как его отладить, будет очень полезно, спасибо!

import os
import gc
import random
from concurrent.futures import ProcessPoolExecutor, as_completed

data_list = []

def _gen_rand_data(n1, n2):
global data_list
for _ in range(n1):
d = {}
for _ in range(n2):
d[str(random.randint(1e6, 1e12))+"87654321"] = str(random.randint(1e6, 1e16))+"12345678"
data_list.append(d)

def _compute_subprocess(j):
global data_list
set_j_sum = sum([int(x) for x in data_list[j].values()])
ret_list = []

for i in range(0, j):
overlap_key_sum = 0
for k, v in data_list.items():
if k in data_list[j]:
overlap_key_sum += int(v)
ret_list.append(overlap_key_sum/set_j_sum)

gc.collect()
return ret_list

def compute():
global data_list
_gen_rand_data(2000, 2000)
final_data = [[-1]*len(data_list) for _ in range(len(data_list))]

futures_dict = {}
finish_cnt = 0

with ProcessPoolExecutor(max_workers=os.cpu_count()) as ppe:
for j in range(1, len(data_list)):
futures_dict[ppe.submit(_compute_subprocess, j)] = j

for future in as_completed(futures_dict):
ret_list = future.result()
j = futures_dict[future]
for i in range(len(ret_list)):
final_data[j] = ret_list
finish_cnt += 1
print("{}/{}".format(finish_cnt, len(data_list)))
gc.collect()

return final_data

compute()



Как и предлагалось, я также пробовал многопроцессорность, код прилагается, проблема все равно та же.

import os
import gc
import random
from multiprocessing import Process, Queue, Pool

data_list = []
final_data = None

def _gen_rand_data(n1, n2):
global data_list
for _ in range(n1):
d = {}
for _ in range(n2):
d[str(random.randint(1e6, 1e12))+"87654321"] = str(random.randint(1e6, 1e16))+"12345678"
data_list.append(d)

def _compute_subprocess(j):
global data_list, final_data
set_j_sum = sum([int(x) for x in data_list[j].values()])

for i in range(0, j):
overlap_key_sum = 0
for k, v in data_list.items():
if k in data_list[j]:
overlap_key_sum += int(v)
final_data[j] = overlap_key_sum/set_j_sum

gc.collect()

def compute():
global data_list, final_data
_gen_rand_data(2000, 2000)
# _gen_rand_data(10, 10)
final_data = [[-1]*len(data_list) for _ in range(len(data_list))]
finish_cnt = 0

proc_list = []
with Pool() as pool:
pool.map(_compute_subprocess, iterable=range(1, len(data_list)))

print(len(final_data))

compute()



Подробнее здесь: https://stackoverflow.com/questions/590 ... processing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»