Límite de Python Numpy.ndarray.shape

Quiero crear una matriz con Numpy en Python con el siguiente código:

import numpy

result=numpy.zeros((20,20,20,30,30,30))

numpy.save('result',result)

Obtuve el siguiente error:

Traceback (most recent call last):  
File "numpy_memoryerror.py",
line 5, in <module>
    result=numpy.zeros((20,20,20,30,30,30))
MemoryError

Si utilizo dimensiones más pequeñas como estas:

result=numpy.ones((10,10,10,20,20,20))

entonces el código funciona.

¿Alguien puede decirme el límite de la tupla de forma?

preguntado el 16 de mayo de 11 a las 18:05

Lo pruebo en mi computadora y genera un archivo .npy de tamaño 1.60 GB (1,728,000,096 bytes). -

1 Respuestas

No es un límite fundamental de la tupla de forma, es que no tiene suficiente memoria (RAM) en su sistema, de ahí el MemoryError.

Nuevamente, 20 * 20 * 20 * 30 * 30 * 30 son 216 millones de flotantes de 64 bits (8 bytes) o un poco más de 1.6 GB de RAM. Entonces, ¿tiene 1.6 GB de RAM libre mientras ejecuta el script en ese momento? (No olvide toda la RAM utilizada por python, el sistema operativo, otros programas en ejecución, etc.). Si está en linux / unix, puede ver cuánta memoria libre hay escribiendo free -m desde el símbolo del sistema. En Windows, puede ver la memoria libre yendo al administrador de tareas. Además, algunos sistemas operativos limitan la cantidad de memoria que puede asignar un solo proceso (como Python); por ejemplo, las ventanas de 32 bits solo ofrecen 2 GB de espacio de direcciones por proceso).

Compare eso con 20 * 20 * 20 * 10 * 10 * 10, que es solo ~ 0.06 GB (o solo 27 veces menos memoria).

Si no necesita flotantes de 8 bytes, puede hacerlo

numpy.zeros(20,20,20,30,30,30, dtype='float32')

lo que reduciría a la mitad su huella de memoria mediante el uso de flotantes de precisión simple (32 bits). Por defecto, numpy usa dtype = 'float64'.

En términos generales, un flotante de 32 bits tiene 8 dígitos de precisión, un flotante de 64 bits tiene 16 dígitos de precisión. Lo que significa que 1 + 1e-8 aparece como 1 para flotantes de 32 bits y 1 + 1e-16 aparece como 1 para flotantes de 64 bits, pero 1 + 1e-15 aparece como 1.000000000000001 con flotantes de 64 bits, pero no 32 -bit flota.

contestado el 16 de mayo de 11 a las 23:05

Lo probé con dtype = 'float32', y funciona, creando un archivo de alrededor de 860mb. Pero, ejecuto Win 7 de 64 bits y tengo 4 GB de RAM, de los cuales están disponibles alrededor de 2.2 GB. Por cierto, hay un mecanismo de intercambio (paginación) de RAM, que se ocupa de los procesos que necesitan más RAM. En este caso, no funciona. - Mileski

@makmiler: tenga en cuenta que para numpy matrices que necesita para tener memoria contigua. Incluso si tiene mucha memoria para consumir, no será necesariamente contigua en trozos tan grandes como sea necesario. Gracias - comer

@eat: La memoria que Windows informa como "disponible" se puede paginar, por lo que se puede paginar en un solo bloque continuo. - Sven Marnach

@Sven: ¿Estás seguro? Por ejemplo, la documentación de matlab (que también requiere un bloque contiguo de RAM para matrices) informa sobre la fragmentación de la memoria por errores de memoria insuficiente. Ver: mathworks.com/support/tech-notes/1100/1106.html - Dr. Jimbob

@Sven: Buen punto, pero en primer lugar me gustaría que el OP describa de manera más detallada su entorno, antes de emitir un juicio final. AFAIU, incluso con Windows de 64 bits, pero el espacio de direcciones virtuales en modo de usuario para procesos de 32 bits (limitándolo solo a 2 GB), puede surgir tal fragmentación. Gracias - comer

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.