Я загружаю 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, пожалуйста, не стесняйтесь.