Предотвратить заполнение пространства ОЗУ от повторной функции Python - PullRequest
0 голосов
/ 09 октября 2019

Ниже приведен пример функции Python, которая просто принимает переменную и выполняет простую математическую операцию с ней перед возвратом.

Если я распараллеливаю эту функцию, чтобы лучше отразить операцию, которую я хотел бы выполнить в реальной жизни, и запускаю распараллеленную функцию 10 раз, я замечаю в своей IDE, что память увеличивается, несмотря на использование строки del results,

import multiprocessing as mp
import numpy as np
from tqdm import tqdm

def function(x):
        return x*2

test_array = np.arange(0,1e4,1)

for i in range(10):

        pool = mp.Pool(processes=4)
        results = list(tqdm(pool.imap(function,test_array),total=len(test_array)))
        results = [x for x in results if str(x) != 'nan']

        del results

У меня есть несколько вопросов, на которые я хотел бы узнать ответы:

  • Есть ли способ предотвратить увеличение памяти?
  • это загрузка памяти из-за процесса распараллеливания?

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Каждый новый процесс, который создает pool.imap, должен получать некоторую информацию о функции и элементе, к которому он применяет функцию. Эта информация является копией и, следовательно, приведет к копированию информации.

Если вы хотите уменьшить его, вы можете посмотреть на аргумент chunksize файла pool.imap.

Другим способом было бы просто полагаться на функции из numpy. Вы могли бы уже сейчас, но вы могли бы просто сделать results = test_array * 2. Я не знаю, как выглядит ваш реальный пример из жизни, но вам может не понадобиться использовать пул Python.

Кроме того, если вы намереваетесь действительно написать быстрый код, не используйте tqdm. Это хорошо, и если вам это нужно, вам это нужно, но это замедлит ваш код.

1 голос
/ 09 октября 2019

Я не пробовал это, но я совершенно уверен, что вам не нужно определять

pool= mp.Pool(processes=4)

В цикле вы запускаете 10 экземпляров пула без причины. ,Может быть, попробуйте убрать это и посмотреть, уменьшится ли использование вашей памяти?

Если это не поможет, рассмотрите возможность реструктуризации вашего кода, чтобы вместо него использовать yield, чтобы предотвратить заполнение вашей памяти.

...