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
Odpowiedz
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.
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
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. –
- 1. Wysoki poziom wykorzystania pamięci podczas korzystania z Hibernate
- 2. Przezwyciężanie ograniczeń pamięci podczas korzystania z przetwarzania wieloprocesowego
- 3. Błąd PicklingError podczas korzystania z przetwarzania wieloprocesowego
- 4. Dane wyjściowe dziennika przetwarzania wieloprocesowego. Przetwarzanie
- 5. Implementacja specjalnego typu kolejki do przetwarzania wieloprocesowego w Pythonie
- 6. konstrukcyjne Dokumenty (poziom wysoki i niski poziom konstrukcyjne dokumenty)
- 7. Uzyskiwanie wykorzystania pamięci procesowej
- 8. Skrypt przy użyciu modułu przetwarzania wieloprocesowego nie kończy się.
- 9. Optymalizacja wykorzystania pamięci w numpy
- 10. Uzyskiwanie progresywnego wykorzystania pamięci GPU
- 11. Jak definiujesz poziom istotności (krytyczny/wysoki/niski itp.) Błędów?
- 12. Ograniczenie całkowitego wykorzystania pamięci PostgreSQL
- 13. Wysoki poziom uwagi na temat kodowania ASP.NET MVC:
- 14. Zwiększenie wykorzystania pamięci przez demona gradle
- 15. Wpływ wykorzystania pamięci stronicowanej do kopiowania pamięci asynchronicznej?
- 16. Szacowanie wykorzystania pamięci w grze Cocos2d
- 17. Parse tylko jeden poziom json
- 18. Czy jest jakiś sposób na zwolnienie pamięci podczas przetwarzania dużej ilości danych?
- 19. Nieoczekiwany błąd podczas przetwarzania pliku hprof: null
- 20. Python3: ImportError: Brak modułu o nazwie "_ctypes" w przypadku użycia wartości z wieloprocesowego przetwarzania modułów
- 21. Błąd systemu podczas wykonywania podprocesów przy użyciu procesu wieloprocesowego
- 22. Google Maps v3: W jaki sposób wymusić wysoki maksymalny poziom powiększenia (maxZoom 24)?
- 23. Jak liczyć użycie procesora wieloprocesowego w Linuksie
- 24. Jak "ls` tylko jeden poziom głębokości?
- 25. Szachy: wysoki współczynnik rozgałęzienia
- 26. Zwiększenie wykorzystania pamięci przez proces "microsoft.vshub.server.httphostx64.exe" podczas korzystania z programu Visual Studio 2015
- 27. Grails: poziom Enterprise Grails
- 28. Operacje matematyczne podczas wstępnego przetwarzania kompilatora
- 29. Pominięcie instrukcji przetwarzania XML podczas serializacji obiektu
- 30. Zapobieganie zatrzymywaniu Azure przez pracownika podczas przetwarzania
Dla zapisu, to nie brzmi jak pamięć * wyciek * w ogóle, tak jak pamięć * użyj *. –
Bardzo prawdziwe, raz jeszcze, złe sformułowanie z mojej strony. – Sandro