mutliprocessing.Pool.add_sync () поглощает память - PullRequest
0 голосов
/ 09 июня 2010

Я хочу использовать многопоточность, чтобы сделать мой скрипт быстрее ... Я все еще новичок в этом. Документ Python предполагает, что вы уже понимаете многопоточность, а что нет.

Итак ...

У меня есть код, который выглядит так

from itertools import izip
from multiprocessing import Pool

p = Pool()
for i, j in izip(hugeseta, hugesetb):
    p.apply_async(number_crunching, (i, j))

Что дает мне большую скорость!

Тем не менее, greatseta и largesetb действительно огромны . Пул хранит все i s и j s в памяти после того, как они закончили свою работу (в основном, вывод на печать на стандартный вывод). Есть ли еще что-то для i и j после их завершения?

Ответы [ 2 ]

0 голосов
/ 09 июня 2010

Не совсем ответ, но вместо этого я использовал Pool.imap():

for i in p.imap(do, izip(Fastitr(seqsa, filetype='fastq'), \
        Fastitr(seqsb, filetype='fastq'))):
    pass

Работает прекрасно, и мусор собирается как положено, однако забавно иметь цикл for, в котором ничего, кроме pass, на самом деле не происходит

0 голосов
/ 09 июня 2010

Оператор del удаляет ссылки на объекты, поэтому может освободить память при запуске сборщика мусора.

from itertools import izip
from multiprocessing import Pool

p = Pool()
for i, j in izip(hugeseta, hugesetb):
    p.apply_async(number_crunching, (i, j))

del i, j
...