Potrzebuję odczytywać w częściach ogromnej tablicy numpy przechowywanej w pliku zmapowanym w pamięci, przetwarzać dane i powtarzać dla innej części tablicy. Cała ta zmienna tablica zajmuje około 50 GB, a moja maszyna ma 8 GB pamięci RAM.Plik odwzorowany w pamięci dla numpy tablic
Początkowo utworzyłem plik zmapowany w pamięci za pomocą numpy.memmap, odczytując wiele mniejszych plików i przetwarzając ich dane, a następnie zapisując przetworzone dane w pliku memmap. Podczas tworzenia pliku memmap nie miałem problemów z pamięcią (okresowo korzystałem z memmap.flush()). Oto jak utworzyć pamięci odwzorowany plik:
mmapData = np.memmap(mmapFile,mode='w+', shape=(large_no1,large_no2))
for i1 in np.arange(numFiles):
auxData = load_data_from(file[i1])
mmapData[i1,:] = auxData
mmapData.flush() % Do this every 10 iterations or so
Jednak przy próbie dostępu małe porcje (< 10 MB) pliku memmap, to zalewa całe barana, gdy obiekt memmap jest tworzony. Maszyna drastycznie zwalnia i nie mogę nic zrobić. Oto jak staram się czytać dane z odwzorowanym pliku pamięci:
mmapData = np.memmap(mmapFile, mode='r',shape=(large_no1,large_no2))
aux1 = mmapData[5,1:1e7]
myślałem użyciu mmap lub numpy.memmap powinien pozwolić mi dostęp do części ogromnych tablic bez próbuje załadować całość na pamięć. czego mi brakuje?
Czy używam niewłaściwego narzędzia, aby uzyskać dostęp do części dużej tablicy numpy (> 20 GB) zapisanej na dysku?
Nie rozmnażałem tego jeszcze, ale wydaje mi się to również zaskakujące. Myślałem, że plastry są tylko grubymi wskazówkami ... Czy jesteś pewien, że wykonanie nie mija zadania Aux1? Jeśli minie zadanie i czytasz je, więcej pamięci będzie ładowanych, niż można się spodziewać, ponieważ linie pamięci podręcznej są większe niż 5 bajtów (zwykle 64 bajty), w zależności od tego, czy używasz polecenia = C "lub" F ". Ale to nadal nie powinno wystarczyć, aby wlać maszynę z 8GB dostępną pamięcią RAM, więc to nie jest odpowiedź. –