2010-12-14 9 views
21

Buduję duży słownik danych ze zbioru plików tekstowych. Jak czytam w liniach i przetwarzam je, I append(dataline) do listy.Dlaczego Python `Błąd pamięci` z listą` append() `wiele pamięci RAM pozostało

W pewnym momencie append() generuje wyjątek Memory Error. Jednak oglądając program uruchamiany w Menedżerze zadań systemu Windows, w momencie awarii widzę 4,3 GB dostępnego i 1,1 GB za darmo.

W związku z tym nie rozumiem przyczyny wyjątku.

Wersja w języku Python to 2.6.6. Chyba jedynym powodem jest to, że nie jest w stanie wykorzystać większej ilości dostępnej pamięci RAM. Jeśli tak, czy możliwe jest zwiększenie alokacji?

+1

Spróbuj użyć 64-bitowej wersji Pythona. Chociaż jeśli korzystasz z modułów rozszerzeń, będą one również wymagać 64-bitowego. –

+0

Czy możesz wydrukować ciąg znaków wyjątku 'MemoryError'? To powinno dać nam więcej informacji. – chrisaycock

+0

Czy dołączasz przed lub po przetworzeniu linii? – nmichaels

Odpowiedz

27

Jeśli używasz 32-bitowej wersji Pythona, możesz wypróbować wersję 64-bitową.

Możliwe jest, aby proces adresował maksymalnie 4 GB pamięci RAM przy użyciu adresów 32-bitowych, ale zazwyczaj (w zależności od systemu operacyjnego) uzyskuje się znacznie mniej. Wygląda na to, że twój proces Pythona może uderzać w ten limit. 64-bitowe adresowanie usuwa to ograniczenie.

edycja Ponieważ pytasz o system Windows, przydatna jest następująca strona: Memory Limits for Windows Releases. Jak widać, limit na proces 32-bitowy to 2, 3 lub 4 GB w zależności od wersji i konfiguracji systemu operacyjnego.

+0

Tak, 32-bitowy. Jakikolwiek sposób kontrolować ile jest przydzielone? Lub, aby zobaczyć, ile jest przydzielana? Chciałbym sprawdzić, czy osiągamy ten limit, czy nie. BTW proces jest wymieniony jako przy użyciu 1.9GB w oknie Menedżera zadań po awarii. – Pete

+0

@Pete Powinieneś być w stanie to zobaczyć w Menedżerze zadań: http://upload.wikimedia.org/wikipedia/en/6/6b/System_idle_process.png (w "Mem Use"). – NPE

+0

Chciałem powiedzieć, zobacz, co to jest limit alokacji lub go zmień, aby zweryfikować, że mamy za mało pamięci, zamiast zakładać 1,9 GB, aktualna alokacja to limit – Pete

4

Jeśli jesteś otwarty na restrukturyzację kodu zamiast rzucać więcej pamięci na nią, może być w stanie dostać się z tego:

data = (processraw(raw) for raw in lines) 

gdzie lines jest albo lista linii lub file.xreadlines() lub podobny .

3

Miałem podobny problem przy użyciu 32-bitowej wersji Pythona w 64-bitowym środowisku Windows. Wypróbowałem 64-bitową wersję Pythona dla Windows i bardzo szybko wpadłem w kłopoty z bibliotekami Scipy skompilowanymi dla 64-bitowych okien.

Całkowicie darmowe rozwiązanie, że realizowany był

1) Instalacja VirtualBox
2) Instalacja CentOS 5.6 na VM
3) Pobierz Distribution Enthought Pythona (Free 64 bit Linux Version).

Teraz wszystkie moje kody Pythona zależne od Numpy, Scipy i Matplotlib mogą zużywać tyle pamięci, ile mam RAM i dostępną zamianę Linuksa.

0

Jak już wspomniano, potrzebny jest bit python64 (64-bitowej wersji systemu Windows).

Należy pamiętać, że prawdopodobnie napotkasz wiele konfliktów i problemów z niektórymi podstawowymi pakietami, z którymi możesz chcieć pracować. Aby uniknąć tego problemu, polecam Anaconda z Continuum Analytics. Radziłbym ci, żebyś to zagłębił :)

3

Miałem podobny problem, gdy analizowałem wyrażenie zawierające duże tablice numpy (w rzeczywistości jeden był rzadki). Robiłem to na maszynie z 64GB pamięci, z czego tylko 8GB było w użyciu, więc zdziwiło mnie, że dostałem MemoryError.

Okazało się, że moim problemem było nadawanie w formie szyku: nieumyślnie zduplikowałem duży wymiar.

Poszło coś takiego:

  • minąłem tablicę w kształcie (286577, 1) gdzie spodziewałem (286577).
  • Zostało to złoŜone z tablicy o kształcie (286577, 130).
  • Ponieważ oczekiwałem, że (286577), zastosowałem [:,newaxis] w wyrażeniu, aby wprowadzić je do (286577,1), aby było transmitowane pod numer (286577,130).
  • Kiedy jednak przekazałem kształt (286577,1), jednak [:,newaxis] wytworzył kształt (286577,1,1), a obie tablice zostały nadane w kształcie (286577,286577,130) ... podwójnych. Przy dwóch takich tablicach dochodzi do około 80 GB!
Powiązane problemy