2016-02-13 7 views
7

Jestem bardzo zdezorientowany tym, co zostało zgłoszone przez numpy.ndarray.nbytes.Dlaczego ta gigantyczna (nieskładna) macierzowa matryca mieści się w pamięci RAM

Właśnie utworzyłem matrycę tożsamości o wielkości 1 miliona (10^6), która ma 1 bilion wierszy (10^12). Numpy zgłasza, że ​​ta tablica ma 7.28TB, jednak proces Pythona wykorzystuje tylko 3,98 GB pamięci, zgodnie z raportem aktywności OSX.

  • Czy cała tablica znajduje się w pamięci?
  • Czy Numpy w jakiś sposób kompresuje swoją reprezentację, czy jest ona obsługiwana przez system operacyjny?
  • Jeśli po prostu obliczyć y = 2 * x, który powinien być tego samego rozmiaru co x, pamięć procesu wzrasta do około 30 GB, aż zostanie zabity przez system operacyjny. Dlaczego i jakie operacje mogę wykonywać na x bez tak dużego wykorzystania pamięci?

Jest to kod użyłem:

import numpy as np 
x = np.identity(1e6) 
x.size 
# 1000000000000 
x.nbytes/1024 ** 4 
# 7.275957614183426 
y = 2 * x 
# python console exits and terminal shows: Killed: 9 
+0

Na oknach ani 32-bitowa, ani 64-bitowa wersja nie pozwoliła mi przydzielić tak dużej matrycy. –

+2

Zgaduję, że jest to związane z [to] (http://stackoverflow.com/q/27574881/1461210), chociaż jestem trochę zaskoczony, że działa na matryce tożsamości, a nie tylko zera. –

+0

@TamasHegedus co jeśli utworzysz matrycę tożsamości o rozmiarze '2e4'? Powinno to zająć 2,98 GB pamięci RAM. Czy proces zajmuje tyle pamięci RAM? – Rems

Odpowiedz

5

W systemie Linux (i jestem przy założeniu, że to samo dzieje się pod Mac), gdy program przydziela pamięć, system operacyjny nie faktycznie przeznaczyć go dopóki go nie użyje.

Jeśli program nigdy nie korzysta z pamięci, system operacyjny nie musi marnować pamięci RAM, ale powoduje, że system operacyjny pojawia się w miejscu, gdy program zażądał tony pamięci i faktycznie musi z niego korzystać, ale system operacyjny ma za mało.

Kiedy to się stanie, system operacyjny może albo zacząć zabijać drobne inne procesy i oddawać pamięć RAM do procesu żądania, albo po prostu zabić proces wnioskowania (co dzieje się teraz).

Początkowe 4 GB pamięci używane przez Python to strony, na których numpy ustawił 1 na macierzy tożsamości; pozostałe strony nie zostały jeszcze wykorzystane. Wykonanie operacji matematycznej, takiej jak , rozpoczyna dostęp (a przez to alokowanie) wszystkich stron, aż do wyczerpania pamięci systemu operacyjnego i zabicia procesu.

1

System alokuje pamięć tylko wirtualnie, tylko za pierwszym razem, gdy zapisujesz do tej pamięci, jest ona faktycznie używana fizycznie. Dla przykładu przydzielisz 1 bilion liczb, co odpowiada 2 miliardom stron pamięci, ale tylko 1 milion (1e6) z tych stron jest używany do zapisu tych na przekątnej. To są dokładnie 4 GB pamięci, które widzisz.

Powiązane problemy