python: sharing огромные словари с использованием многопроцессорной обработки

Я обрабатываю очень большие объемы данных, хранящихся в словаре, используя многопроцессорность. В основном все, что я делаю, это загружаю некоторые подписи, хранящиеся в словаре, создание из него общего 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. На этом этапе использование ОЗУ начинает быстро уменьшаться, и процесс завершается с указанной выше ошибкой. Полагаю, это не из-за ошибки нехватки памяти ...

Есть идеи или предложения?

Спасибо,

Давиде

7
задан Davide C 26 December 2010 в 17:15
поделиться