2010-06-22 9 views
7

Moja pamięć procesu kodu pythona zwiększa się dynamicznie, ponieważ przechowuje dynamiczne dane na liście, słowniku i krotkach tam, gdzie jest to konieczne. Chociaż wszystkie te dynamiczne dane są fizycznie usuwane w swoich zmiennych, pamięć nie zanika.rosnąca pamięć procesu Pythona w czasie

Stąd czułem się, jak istnieje wyciek pamięci i użyłem metody gc.collect() do zebrania wszystkich braków pamięci. Ale nie mogłem zmusić pamięci do minimum, gdy nie ma danych w zmiennych.

+0

Dlaczego miałbyś oczekiwać, że zejdzie? Z jakiego systemu operacyjnego korzystasz? W wielu systemach operacyjnych, gdy proces uzyskał pamięć, proces pozostaje tak duży. –

+0

Używam mac osx 10.5, wierzę, że później zjem więcej miejsca. obecnie wzrosła o około 15 MB z 24 MB w początkowej fazie. Uważam, że pamięć procesowa powinna rosnąć pod względem MB, co może wpłynąć na dostępny rozmiar pamięci. – herby

Odpowiedz

6

To bardzo trudne, w ogóle, za to proces „dać pamięci z powrotem do systemu operacyjnego” (aż proces kończy i OS wróci wszystko pamięć, oczywiście), ponieważ (w większości implementacji) co malloc zwroty są wycięte z dużych bloków dla zwiększenia wydajności, ale cały blok nie może zostać zwrócony, jeśli jakakolwiek jego część jest nadal używana - tak więc większość standardowych bibliotek C nawet nie próbuje.

Aby uzyskać dobrą dyskusję w kontekście Python, zobacz np. here. Evan Jones naprawił niektóre problemy specyficzne dla Pythona, jak opisano w tym artykule: here i here, ale jego łatka znajduje się w pniu od Pythona 2.5, więc problemy, które obserwujesz, są zdecydowanie związane z pakietem systemowym malloc, a nie z Pythonem per se. Wyjaśnienie specyficzne dla wersji 2.6 to here i here.

tak wątek jest here, gdzie Hugh Allen w swojej odpowiedzi cytuje programistów Firefoksa w zakresie, Mac OS X to system, w którym to w zasadzie niemożliwedla procesu dać pamięci z powrotem do systemu operacyjnego.

Tak więc, tylko poprzez zakończenie procesu możesz mieć pewność, że zwolnisz jego pamięć. Na przykład długo działający serwer może co jakiś czas przechwytywać jego stan na dysk i wyłączać go (z niewielkim procesem watchdoga, systemem lub niestandardowym, oglądając go i uruchamiając go ponownie). Jeśli wiesz, że następna operacja zajmie dużo pamięci przez krótki czas, często możesz os.fork, wykonać żądaną pamięć pracę w procesie potomnym, a wyniki (jeśli są) powrócić do procesu nadrzędnego za pomocą potoku proces potomny zostaje zakończony. I tak dalej i tak dalej.

0

Jak dużo rozmawiamy? Sam Python zajmuje trochę pamięci ... może do 30 lub 40 MB. Jeśli jest większy i nie jest zbierany, masz wyciek pamięci. Tylko śmieci bez referencji mogą być zbierane, w jakiś sposób twoje dodatkowe rzeczy są wciąż przywoływane. Zrób profil pamięci i zobacz, co się dzieje.

+0

obecnie wzrosła o około 15 MB z 24 MB w początkowej fazie dla scenariusza minimalnego. Jednak próbowałem poniższy link narzędzie, z którego stwierdziłem, że dane odniesienia nie są większe niż 3 MB. Nie mogłem uzyskać pozostałej ilości szczegółów pamięci. – herby

+0

To nie jest takie duże. Jeśli szukasz programu o bardzo niskiej pamięci, zwykle nie kodujesz w Pythonie. Większość komputerów ma 2-4 GB pamięci RAM, a 15 MB nie jest warte martwienia się. – bwawok

Powiązane problemy