Sono molto confuso da quanto riportato da numpy.ndarray.nbytes
.Perché questa matrice numerica gigante (non sparsa) si adatta alla RAM
Ho appena creato una matrice di identità di dimensione 1 milione (10^6), che pertanto ha 1 trilione di righe (10^12). Numpy riporta che questo array è 7,28 TB, eppure il processo Python utilizza solo 3,98 GB di memoria, come riportato dal monitor di attività OSX.
- L'intero array è contenuto nella memoria?
- Numpy comprime in qualche modo la sua rappresentazione o è gestita dal sistema operativo?
- Se si calcola semplicemente
y = 2 * x
, che dovrebbe essere della stessa dimensione dix
, la memoria di processo aumenta a circa 30 GB, fino a quando non viene uccisa dal sistema operativo. Perché, e che tipo di operazioni posso condurre su x senza che l'utilizzo della memoria si espanda così tanto?
Questo è il codice che ho usato:
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
Su Windows né la versione a 32 bit né a 64 bit mi ha permesso di allocare una matrice così grande –
La mia ipotesi è che sia correlata a [questo] (http://stackoverflow.com/q/27574881/1461210), sebbene io sia un po 'sorpreso dal fatto che funzioni per matrici di identità anziché solo zeri. –
@TamasHegedus cosa succede se crei una matrice di identità di dimensione '2e4'? Dovrebbero essere necessari 2,98 GB di RAM. Il processo occupa così tanta RAM? – Rems