Przetwarzam bardzo duże ilości danych, przechowywane w słowniku, przy użyciu wieloprocesowości. Zasadniczo wszystko, co robię, to ładowanie niektórych podpisów, przechowywanie w słowniku, budowanie z niego wspólnego obiektu dict (pobieranie obiektu 'proxy' zwróconego przez program Manager.dict()) i przekazywanie tego proxy jako argumentu funkcji, która ma do wykonania w trybie wieloprocesowym.python: udostępnianie ogromnych słowników przy użyciu wieloprocesowości
prostu do wyjaśnienia:
signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map (myfunction , [ signaturesProxy ]*NUM_CORES)
Teraz wszystko działa perfekcyjnie jeśli podpisy jest mniejsza niż 2 miliony wpisów lub więcej. W każdym razie, muszę przetworzyć słownik z kluczami 5.8M (zbieranie podpisów w formacie binarnym generuje plik 4,8 GB). W tym przypadku proces umiera podczas tworzenia obiektu proxy:
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
---------------------------------------------------------------------------
Znam struktura danych jest ogromny, ale pracuję na maszynie wyposażone w/32GB pamięci RAM oraz systemem top widzę, że proces, po załadowaniu sygnatur, zajmuje 7 GB pamięci RAM. Następnie zaczyna budować obiekt proxy, a użycie pamięci RAM wzrasta do ~ 17 GB pamięci RAM, ale nigdy nie zbliża się do 32. W tym momencie użycie pamięci RAM zaczyna maleć szybko i proces kończy się z powyższym błędem. Sądzę więc, że nie jest to spowodowane błędem braku pamięci ...
Czy masz pomysł lub sugestię?
Dziękuję
Davide
Czy to działa z Windows 7 (który jest zdecydowanie nowoczesnym systemem operacyjnym?) –
@Seun: Nie wiem; spróbuj go przetestować. Wątpię, aby jego model procesu był bardziej nowoczesny niż poprzednie wersje; Windows zawsze był w ciemnych wiekach. –
(Nic takiego jak SO dla losowych, niepoprawnych downvotes.) –