2009-11-05 11 views
10

Mam program Python, który umiera z MemoryError, gdy karmię go duży plik. Czy są jakieś narzędzia, których mógłbym użyć, aby dowiedzieć się, co używa pamięci?Jak debugować MemoryError w Pythonie? Narzędzia do śledzenia użycia pamięci?

Ten program działał poprawnie na mniejszych plikach wejściowych. Oczywiście program wymaga pewnej poprawy skalowalności; Próbuję tylko dowiedzieć się, gdzie. "Benchmark przed optymalizacją", jak kiedyś powiedział mądry człowiek.

(Tylko w celu zabezpieczenia przed nieuniknioną odpowiedzią "dodaj więcej pamięci RAM": działa na 32-bitowym pudełku WinXP z 4 GB pamięci RAM, więc Python ma dostęp do 2 GB używanej pamięci, a dodanie większej ilości pamięci jest technicznie niemożliwe. mój PC z 64-bitowym systemie Windows nie jest możliwe)

EDIT:. Ups, to jest duplikatem Which Python memory profiler is recommended?

Odpowiedz

9

Heapy jest profiler pamięci dla Pythona, który jest rodzajem narzędzia trzeba.

+1

BTW duplikat tego: http://stackoverflow.com/questions/110259/python-memory-profiler – Wim

3

Najprostszym i lekki sposób będzie prawdopodobnie używać built in memory query capabilities Pythona, takich jak sys.getsizeof - wystarczy go uruchomić w obiektach o obniżonej problemu (czyli mniejszy plik) i zobaczyć, co zajmuje dużo pamięci.

+3

Dobre i szybkie rozwiązanie. Pewne ograniczenia, ponieważ musisz wiedzieć, który to obiekt (lub zgadywać). Również, robiąc to na liście zawierającej 100 obiektów po 100 MB, zwróci rozmiar 100 wskaźników (czyli tylko kilka KB) ... – Wim

2

W twoim przypadku odpowiedź jest prawdopodobnie bardzo prosta: nie czytaj całego pliku naraz, ale przetwarzaj porcję pliku według porcji. To może być bardzo łatwe lub skomplikowane w zależności od scenariusza użycia. Na przykład obliczenie sumy kontrolnej MD5 można wykonać znacznie wydajniej w przypadku dużych plików bez odczytu całego pliku. Ta ostatnia zmiana znacznie zmniejszyła zużycie pamięci w niektórych scenariuszach użycia SCons, ale było prawie niemożliwe do prześledzenia za pomocą profilera pamięci.

Jeśli nadal potrzebujesz profilera pamięci: eliben już zasugerował sys.getsizeof. Jeśli to nie spowoduje, spróbuj Heapy lub Pympler.

1

Pytałeś zalecenia narzędzia:

Python pamięci Validator pozwala na monitorowanie zużycia pamięci, lokalizacje alokacji kolekcje GC instancji obiektu, zrzuty pamięci, etc aplikacji Pythona. Tylko system Windows.

http://www.softwareverify.com/python/memory/index.html

Zastrzeżenie: Brałem udział w tworzeniu tego oprogramowania.

+3

Dlaczego tylko Windows? Musisz zdać sobie sprawę, że jest to niewielka mniejszość programistów w Pythonie. – Will

Powiązane problemy