Я обрабатываю очень большие объемы данных, хранящиеся в словаре, используя многопроцессорность. По сути, все, что я делаю, это загружаю некоторые подписи, хранящиеся в словаре, строю из него общий объект dict (получая объект 'proxy', возвращаемый Manager.dict ()), и передаю этот прокси в качестве аргумента функции, которая имеет для выполнения в многопроцессорном режиме.
Просто для ясности:
signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map ( myfunction , [ signaturesProxy ]*NUM_CORES )
Теперь все работает отлично, если подписей меньше 2 миллионов записей или около того. В любом случае, мне нужно обработать словарь с 5,8 млн ключей (при обработке подписей в двоичном формате создается файл размером 4,8 ГБ). В этом случае процесс умирает во время создания прокси-объекта:
Traceback (most recent call last):
File "matrix.py", line 617, in <module>
signaturesProxy = manager.dict(signatures)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 634, in temp
token, exp = self._create(typeid, *args, **kwds)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 534, in _create
id, exposed = dispatch(conn, None, 'create', (typeid,)+args, kwds)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 79, in dispatch
raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError:
---------------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python2.6/multiprocessing/managers.py", line 173, in handle_request
request = c.recv()
EOFError
---------------------------------------------------------------------------
Я знаю, что структура данных огромна, но я работаю на машине, оснащенной 32 ГБ ОЗУ, и, работая наверху, я вижу, что процесс после загрузки подписей занимает 7 ГБ ОЗУ. Затем он начинает создание прокси-объекта, и использование ОЗУ увеличивается до ~ 17 ГБ, но никогда не приближается к 32. На этом этапе использование ОЗУ начинает быстро уменьшаться, и процесс завершается с указанной выше ошибкой. Так что я думаю, это не из-за ошибки нехватки памяти ...
Есть идея или предложение?
Спасибо,
Давид