Otrzymuję problem z pamięcią, której nie mogę zrozumieć.Python 32-bitowe limity pamięci na 64-bitowe okna
Jestem na komputerze Windows 7 z 64-bitową pamięcią i uruchomieniem 32-bitowego programu python.
Programy odczytują 5118 zipowanych plików numpy (npz). systemu Windows informuje, że pliki zajmują 1,98 GB na dysku
Każdy plik NPZ zawiera dwa elementy danych: „arr_0” jest typu np.float32 i „arr_1” jest typu np.uint8
Skrypt Pythona odczytuje każdy plik dołącza swoje dane do dwóch list, a następnie zamyka plik.
Około pliku 4284/5118 program rzuca MemoryException
Jednak menedżer zadań, mówi, że użycie pamięci python.exe * 32, gdy wystąpi błąd jest 1,854,848K ~ = 1,8 GB. Znacznie mniej niż mój limit 8 GB lub przypuszczalny limit 4 GB programu 32-bitowego.
W programie przechwytywam błąd pamięci i raportuje: Każda lista ma długość 4285. Pierwsza lista zawiera łącznie 1 928 588 480 danych float32 ~ ~ 229,9 MB. Druga lista zawiera 12 342 96,27 272 uint8 ~ = 1 471,3 MB danych.
Wszystko wydaje się być sprawdzane. Z wyjątkiem części, w której pojawia się błąd pamięci. Absolutnie mam więcej pamięci, a plik, na którym się zawiesza, ma ~ 800 KB, więc nie zawiedzie przy odczycie ogromnego pliku.
Ponadto plik nie jest uszkodzony. Mogę to przeczytać dobrze, jeśli wcześniej nie zużyję całej tej pamięci.
Aby wszystko było bardziej zagmatwane, wszystko to działa dobrze na moim komputerze z systemem Linux (chociaż ma 16 GB pamięci w przeciwieństwie do 8 GB na moim komputerze z systemem Windows), ale nadal nie wydaje się być pamięci RAM komputera, który powoduje ten problem.
Dlaczego Python zgłasza błąd pamięci, kiedy oczekuję, że będzie w stanie przydzielić kolejne 2 GB danych?
Ilość fizycznej pamięci RAM, którą masz, jest nieistotna. W systemie Windows zawsze masz zamiany, czy tego chcesz, czy nie. – abarnert
Kiedy to działa na twoim komputerze z Linuksem ... czy to samo dotyczy też 32-bitowego Pythona? – abarnert
czy możesz opublikować kod, którego używasz do załadowania pliku '.npz'? jeśli użyjesz 'np.load (file, mmap_mode = 'r +')' to użyje znacznie mniej pamięci, ponieważ z tym argumentem otworzysz ['tablicę z mapowaną pamięcią'] (http://docs.scipy.org /doc/numpy/reference/generated/numpy.load.html) ... –