2012-06-28 14 views
7

Estoy usando numpy para crear una matriz de cubos con lados de longitud 100, que contiene un total de 1 millón de entradas. Para cada una de las millones de entradas, estoy insertando una matriz 100x100 cuyas entradas están compuestas de números generados aleatoriamente. Estoy utilizando el siguiente código para hacerlo:¿Cuánta memoria hay en la matriz numpy? ¿Es la RAM un factor 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 

me esperaba que esto tenga un tiempo, pero con 10 mil millones de números aleatorios que se generan, no estoy seguro de que mi equipo puede incluso manejar la situación. ¿Cuánta memoria ocuparía una matriz así? ¿Sería la RAM un factor limitante, es decir, si mi computadora no tiene suficiente RAM, podría no generar realmente la matriz?

Además, si hay un más eficiente para implementar este código, le agradecería consejos :)

+4

Suponiendo 'double' precisión, a los 8 bytes cada uno, si Realmente estamos tratando de almacenar 10 mil millones de ellos, eso es 80GB. Si tiene que preguntar, su computadora no tiene suficiente memoria. Dicho eso, parece que los estás creando todos pero no los almacenas, por lo que deberías estar bien. – Gabe

Respuesta

17

un par de puntos:

  • El tamaño de la memoria de matrices numpy es fácil de calcular. Es simplemente el número de elementos multiplicado por el tamaño de los datos, más una pequeña sobrecarga constante. Por ejemplo, si su cube.dtype es int64, y tiene 1,000,000 de elementos, requerirá 1000000 * 64/8 = 8,000,000 bytes (8Mb).
  • Sin embargo, como notas de @Gabe, 100 * 100 * 1,000,000 de dobles requerirán alrededor de 80 Gb.
  • Esto no hará que nada "se rompa", per-se, pero las operaciones serán ridículamente lentas debido a todo el swapping que su computadora tendrá que hacer.
  • Tus loops no harán lo que esperas. En lugar de reemplazar el elemento en cube, element = matrix simplemente sobrescribirá la variable element, dejando el cube sin cambios. Lo mismo ocurre con el entry = random.rand() * 100.
  • En cambio, véase: http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values
+1

Las cosas se "romperán" si excedes la cantidad total de memoria virtual disponible, lo que parece muy probable en este caso ya que no muchas personas tienen> 80GB de espacio de intercambio –

+0

Esto no es completamente el caso cuando se trata de funciones como 'np .zeros() '. La carga diferida se usa (al menos en las versiones de Linux), lo que evitará el uso de grandes cantidades de memoria hasta que se acceda a ciertos elementos. Por ejemplo, puede hacer una matriz con 'np.zeros ((24000,24000))', y no ocupa mucha memoria, pero si lo hace 'np.random.random ((24000,24000))', toma un poco más de 4 GB. Mejor explicación: https://stackoverflow.com/questions/27574881/why-does-numpy-zeros-takes-up-little-space –

2

para la parte "interior" de su función, consulte el módulo numpy.random

import numpy as np 
matrix = np.random.random((100,100))*100 
Cuestiones relacionadas