2010-04-24 20 views
5

Próbuję użyć biblioteki przetwarzania wieloprocesorowego Pythona, aby uzyskać pewną wydajność. W szczególności używam jego funkcji map. Teraz, z jakiegoś powodu, kiedy wymieniam go na pojedynczy przetworzony odpowiednik, nie uzyskuję wysokiego zużycia pamięci. Ale użycie wieloprocesowej wersji mapy powoduje, że moja pamięć przechodzi przez dach. Dla zapisu robię coś, co z łatwością może pochłonąć mnóstwo pamięci, ale jaka byłaby różnica między tymi dwoma, aby spowodować tak poważną różnicę?Wysoki poziom wykorzystania pamięci tylko podczas przetwarzania wieloprocesowego

+0

Dla zapisu, to nie brzmi jak pamięć * wyciek * w ogóle, tak jak pamięć * użyj *. –

+0

Bardzo prawdziwe, raz jeszcze, złe sformułowanie z mojej strony. – Sandro

Odpowiedz

4

Zdajesz sobie sprawę, że proces wieloprocesowy nie używa wątków, tak? Mówię to, ponieważ wspominasz "jednego gwintowanego odpowiednika".

Czy wysyłasz dużo danych przez multiprocessing za map? Prawdopodobną przyczyną jest konieczność wieloprocesowości szeregowania w wielu przypadkach. multiprocessing używa pickle, co zwykle zajmuje więcej pamięci niż dane do wytrawiania. (W niektórych przypadkach, w szczególności w systemach z fork() gdzie nowe procesy są tworzone podczas wywołania metody map, może uniknąć serializacji, ale kiedy musi wysłać nowe dane do istniejącego procesu nie można zrobić.)

Rejestracja z całą rzeczywistą pracą jest wykonywana w oddzielnych procesach, rzeczywiste operacje, które wykonujesz, nie mają wpływu na pamięć głównego procesu. Całkowite wykorzystanie pamięci wzrasta jednak znacznie, ponieważ każdy proces roboczy ma kopię danych, które wysłałeś. Czasami jest to pamięć typu "copy-on-write" (w tych samych przypadkach, co bez serializacji) w systemach, które mają funkcję CoW, ale użycie pamięci przez Python jest takie, że szybko staje się to zapisywane, a zatem kopiowane.

+0

Dobrze, przepraszam, ale wiem, że wieloprocesor w rzeczywistości nie używa nici. (Stąd nazwa) Przesyłanie informacji przez potok jest tym, co go zabija. Ma dużo sensu. Czy znasz jakieś rozwiązania problemu, z którym się borykam? – Sandro

+1

Przesyłaj mniej danych. Lub wyślij go w mniejszych porcjach. Lub, jeśli używasz systemu z fork(), spraw, aby serializacja się nie odbyła: upewnij się, że proces wieloprocesowy rozpocznie nowe procesy. –

Powiązane problemy