Утечка памяти при многопроцессорной обработке. Пул даже после закрытия () - PullRequest
3 голосов
/ 08 января 2012

Я загружаю 12 файлов XML (по 30-80 МБ каждый) в скрипте Python:

import xml.etree.ElementTree as ET
files = ['1.xml', '2.xml', ..., '11.xml', '12.xml']
trees = [ET.parse(f) for f in files]

Это займет около 50 секунд, чтобы бежать. Я буду запускать его несколько раз, поэтому подумал, что попытаюсь ускорить его с помощью многопроцессорной обработки:

import multiprocessing    
trees = [None] * len(files)

def _parse_(i):
    return (i, ET.parse(files[i]))

def _save_((i, tree)):
    trees[i] = tree

def concurrent_parse():
    pool = multiprocessing.Pool()
    for i in range(len(files)):
        pool.apply_async(func=_parse_, args=(i,), callback=_save_)
    pool.close()
    pool.join()

Это теперь работает через 30 с, что является хорошим улучшением. Тем не менее, я запускаю все это из оболочки, а затем работаю над данными в интерактивном режиме. После завершения первой не параллельной версии использование памяти Python составляет 1,73 ГБ. После одновременного использования памяти используется 2,57 ГБ.

Я новичок в использовании многопроцессорной обработки, поэтому, пожалуйста, прости меня, если я что-то упустил. Но все другие проблемы с потерей памяти после использования пула указывают на сбой вызова close (), который я делаю.

PS - если это действительно глупый способ загрузки 12 файлов XML, пожалуйста, не стесняйтесь.

1 Ответ

2 голосов
/ 08 января 2012

Я не уверен, что это на самом деле утечка, параллельной реализации потребуется больше памяти для одновременного хранения всех файлов.Тогда python может удалять объекты, но не возвращать память в ОС, которая выглядит как python, использующий больше памяти, чем нужно для существующих объектов.Так что же произойдет, если вы запустите concurrent_parse () несколько раз?Если использование памяти постоянно, то это не утечка.Если память увеличивается после каждого запуска, то это проблема, и вы можете посмотреть в этом потоке информацию о трассировке утечек - Утечки памяти Python .

...