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 cox
, 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
Na oknach ani 32-bitowa, ani 64-bitowa wersja nie pozwoliła mi przydzielić tak dużej matrycy. –
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. –
@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