2012-06-28 15 views
7

Sto usando numpy per creare un cubo array con lati di lunghezza 100, quindi contenente 1 milione di voci totali. Per ognuna delle milioni di voci, inserisco una matrice 100x100 le cui voci sono composte da numeri generati casualmente. Sto usando il seguente codice per farlo:Quanta memoria nell'array numpy? La RAM è un fattore limitante?

import random 
from numpy import * 

cube = arange(1000000).reshape(100,100,100) 

for element in cube.flat: 
    matrix = arange(10000).reshape(100,100) 
    for entry in matrix.flat: 
     entry = random.random()*100 
    element = matrix 

mi aspettavo questo per prendere un po ', ma con 10 miliardi di numeri casuali generati, non sono sicuro che il mio computer è in grado anche di gestirlo. Quanta memoria occuperebbe un simile array? La RAM sarebbe un fattore limitante, cioè se il mio computer non ha abbastanza RAM, potrebbe non riuscire a generare effettivamente l'array?

Inoltre, se v'è una più efficiente per implementare questo codice, apprezzerei suggerimenti :)

+4

Supponendo 'double' precisione, a 8 byte ognuno, se stanno davvero cercando di archiviare 10 miliardi di loro, ovvero 80 GB. Se devi chiedere, il tuo computer non ha abbastanza memoria. Detto questo, sembra che tu li stia creando tutti ma non li memorizzi, quindi dovresti stare bene. – Gabe

risposta

17

A punti paio:

  • La dimensione in memoria di array NumPy è facile da calcolare. È semplicemente il numero di elementi per la dimensione dei dati, più un piccolo overhead costante. Ad esempio, se il tuo cube.dtype è int64 e dispone di 1.000.000 di elementi, richiederà 1000000 * 64/8 = 8,000,000 byte (8Mb).
  • Tuttavia, come osserva @Gabe, 100 * 100 * 1.000.000 di doppi richiedono circa 80 Gb.
  • Ciò non causerà alcuna "interruzione", per sé, ma le operazioni saranno ridicolmente lente a causa di tutto il swapping che il computer dovrà fare.
  • I tuoi loop non faranno quello che ti aspetti. Invece di sostituire l'elemento in cube, lo element = matrix semplicemente sovrascrive la variabile element, lasciando invariato lo cube. Lo stesso vale per lo entry = random.rand() * 100.
  • Invece, vedi: http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values
+1

Le cose si "spezzano" effettivamente se superi la quantità totale di memoria virtuale disponibile, il che sembra molto probabile in questo caso poiché non molte persone hanno> 80 GB di spazio di scambio –

+0

Questo non è il caso quando si tratta di funzioni come 'np .zeros() '. Viene utilizzato il caricamento lento (almeno nelle versioni di Linux), che eviterà l'utilizzo di grandi quantità di memoria fino a quando non si accede a determinati elementi. Ad esempio, puoi creare una matrice con 'np.zeros ((24000,24000))', e non occupa molta memoria, ma se fai 'np.random.random ((24000,24000))', occupa poco più di 4 GB. Migliore spiegazione: https://stackoverflow.com/questions/27574881/why-does-numpy-zeros-takes-up-little-space –

2

per la parte "interna" della funzione, guarda il modulo numpy.random

import numpy as np 
matrix = np.random.random((100,100))*100 
Problemi correlati