NumPy to niezwykle przydatna biblioteka, a korzystając z niej stwierdziłem, że z łatwością radzi sobie z dość dużymi macierzami (10000 x 10000), ale zaczyna borykać się z czymkolwiek znacznie większym (próbując stworzyć macierz o wymiarach 50000 x 50000 zawodzi). Oczywiście wynika to z ogromnych wymagań dotyczących pamięci.
Czy istnieje sposób na natywne tworzenie ogromnych macierzy w NumPy (powiedzmy 1 milion na 1 milion) w jakiś sposób (bez posiadania kilku terabajtów pamięci RAM)?
numpy.array
mają żyć w pamięci. Jeśli chcesz pracować z matrycami większymi niż twoja pamięć RAM, musisz to obejść. Istnieją co najmniej dwa podejścia, które możesz zastosować:scipy.sparse.csc_matrix
.źródło
Powinieneś być w stanie użyć numpy.memmap do mapowania pamięci pliku na dysku. W nowszym Pythonie i 64-bitowej maszynie powinieneś mieć niezbędną przestrzeń adresową, bez ładowania wszystkiego do pamięci. System operacyjny powinien obsługiwać tylko przechowywanie części pliku w pamięci.
źródło
Aby obsłużyć rzadkie macierze, potrzebujesz
scipy
pakietu, który znajduje się na górzenumpy
- zobacz tutaj, aby uzyskać więcej informacji na temat opcji macierzy rzadkich, którescipy
dają ci.źródło
Post Stefano Boriniego skłonił mnie do przyjrzenia się, jak daleko są już tego typu rzeczy.
To jest to. Wydaje się, że zasadniczo robi to, co chcesz. HDF5 pozwoli ci przechowywać bardzo duże zbiory danych, a następnie uzyskiwać do nich dostęp i używać ich w taki sam sposób, jak robi to NumPy.
źródło
Upewnij się, że używasz 64-bitowego systemu operacyjnego i 64-bitowej wersji języka Python / NumPy. Należy zauważyć, że na architekturach 32-bitowych można zwykle zaadresować 3 GB pamięci (z około 1 GB utraconym na potrzeby operacji we / wy mapowanych w pamięci i tym podobnych).
Dzięki 64-bitowym tablicom i tablicom rzeczy większym niż dostępna pamięć RAM możesz uciec z pamięcią wirtualną, chociaż sytuacja będzie wolniejsza, jeśli będziesz musiał się zamienić. Również mapy pamięci (patrz numpy.memmap) to sposób na pracę z ogromnymi plikami na dysku bez ładowania ich do pamięci, ale znowu, aby móc pracować z dużą ilością użytecznych funkcji, musisz mieć 64-bitową przestrzeń adresową. PyTables zrobi to również za Ciebie.
źródło
To trochę alfa, ale http://blaze.pydata.org/ wydaje się pracować nad rozwiązaniem tego problemu.
źródło
Czasami jednym prostym rozwiązaniem jest użycie niestandardowego typu dla elementów macierzy. W
dtype
zależności od zakresu potrzebnych numerów możesz użyć instrukcji, a szczególnie mniejszych dla swoich przedmiotów. Ponieważ Numpy domyślnie bierze pod uwagę największy typ obiektu, może to być pomocny pomysł w wielu przypadkach. Oto przykład:In [70]: a = np.arange(5) In [71]: a[0].dtype Out[71]: dtype('int64') In [72]: a.nbytes Out[72]: 40 In [73]: a = np.arange(0, 2, 0.5) In [74]: a[0].dtype Out[74]: dtype('float64') In [75]: a.nbytes Out[75]: 32
Oraz z niestandardowym typem:
In [80]: a = np.arange(5, dtype=np.int8) In [81]: a.nbytes Out[81]: 5 In [76]: a = np.arange(0, 2, 0.5, dtype=np.float16) In [78]: a.nbytes Out[78]: 8
źródło
Czy zastanawiasz się, jak poradzić sobie z macierzą 2500000000 elementów bez terabajtów pamięci RAM?
Sposobem na obsłużenie 2 miliardów elementów bez 8 miliardów bajtów pamięci RAM jest nieprzechowywanie macierzy w pamięci.
Oznacza to znacznie bardziej wyrafinowane algorytmy pobierania go z systemu plików w częściach.
źródło
(row, column, value)
tych wpisów, które istnieją.Zwykle, gdy mamy do czynienia z dużymi macierzami, implementujemy je jako rzadkie macierze .
Nie wiem, czy numpy obsługuje rzadkie macierze, ale zamiast tego znalazłem to .
źródło
O ile wiem o numpy, nie, ale mogę się mylić.
Mogę zaproponować Ci alternatywne rozwiązanie: napisz macierz na dysku i dostęp do niej fragmentami. Proponuję format pliku HDF5. Jeśli potrzebujesz tego w sposób przejrzysty, możesz ponownie zaimplementować interfejs ndarray, aby podzielić macierz zapisaną na dysku w pamięci. Zachowaj ostrożność, jeśli zmodyfikujesz dane, aby zsynchronizować je z powrotem na dysku.
źródło