Pregunta Matrices muy grandes usando Python y NumPy


NumPy es una biblioteca extremadamente útil, y al usarla he descubierto que es capaz de manejar matrices que son bastante grandes (10000 x 10000) fácilmente, pero comienza a tener problemas con algo mucho más grande (falla crear una matriz de 50000 x 50000) ) Obviamente, esto se debe a los requisitos de memoria masiva.

¿Existe alguna forma de crear enormes matrices de forma nativa en NumPy (digamos 1 millón por 1 millón) de alguna manera (sin tener varios terrabytes de RAM)?


75
2018-06-28 00:32


origen


Respuestas:


PyTables y NumPy son el camino a seguir.

PyTables almacenará los datos en el disco en formato HDF, con compresión opcional. Mis conjuntos de datos a menudo tienen una compresión de 10x, que es útil cuando se trata de decenas o cientos de millones de filas. También es muy rápido; mi computadora portátil de 5 años de antigüedad puede atravesar los datos haciendo una agregación GROUP BY similar a SQL en 1,000,000 de filas / segundo. ¡No está mal para una solución basada en Python!

Acceder nuevamente a los datos como un recarray NumPy es tan simple como:

data = table[row_from:row_to]

La biblioteca HDF se encarga de leer los fragmentos relevantes de datos y convertirlos a NumPy.


84
2018-06-30 09:11



numpy.arrays están destinados a vivir en la memoria. Si quieres trabajar con matrices más grandes que tu RAM, tienes que trabajar en eso. Hay al menos dos enfoques que puede seguir:

  1. Pruebe una representación matricial más eficiente que explota cualquier estructura especial que tengan tus matrices. Por ejemplo, como otros ya han señalado, existen estructuras de datos eficientes para matrices dispersas (matrices con muchos ceros), como scipy.sparse.csc_matrix.
  2. Modifique su algoritmo para trabajar en submatrices. Puede leer desde el disco solo los bloques de matriz que se usan actualmente en los cálculos. Los algoritmos diseñados para ejecutarse en clusters generalmente funcionan en bloque, ya que los datos se distribuyen en diferentes computadoras y se pasan solo cuando es necesario. Por ejemplo, el algoritmo Fox para la multiplicación de matrices (archivo PDF).

53
2018-06-28 02:53



Debería poder usar numpy.memmap para mapear en memoria un archivo en el disco. Con la máquina más nueva de python y 64 bits, debe tener el espacio de direcciones necesario, sin cargar todo en la memoria. El sistema operativo debe manejar solo para mantener parte del archivo en la memoria.


29
2018-06-28 01:46



Para manejar matrices dispersas, necesitas el scipy paquete que se sienta encima de numpy -- ver aquí para más detalles sobre las opciones de matriz dispersa que scipy te dio.


24
2018-06-28 02:23



Stefano Borini enviar me hizo ver cuánto tiempo ya está en este tipo de cosas.

Eso es todo.  Parece hacer básicamente lo que quieres. HDF5 le permitirá almacenar conjuntos de datos muy grandes, y luego acceder a ellos y usarlos de la misma forma que lo hace NumPy.


11
2018-06-28 02:54



Asegúrese de estar utilizando un sistema operativo de 64 bits y una versión de 64 bits de Python / NumPy. Tenga en cuenta que en las arquitecturas de 32 bits puede abordar típicamente 3 GB de memoria (con aproximadamente 1 GB de pérdida de E / S asignadas a la memoria, etc.).

Con arreglos de 64 bits y cosas más grandes que la RAM disponible, puede salirse con la suya con la memoria virtual, aunque las cosas serán más lentas si tiene que cambiar. Además, los mapas de memoria (vea numpy.memmap) son una forma de trabajar con archivos enormes en el disco sin cargarlos en la memoria, pero nuevamente, necesita tener un espacio de direcciones de 64 bits para que esto sea de mucha utilidad. PyTables hará la mayor parte de esto por ti también.


5
2017-08-19 00:27



Es un poco alfa, pero http://blaze.pydata.org/ parece estar trabajando en resolver esto.


5
2018-02-05 00:58



¿Estás preguntando cómo manejar una matriz de elementos de 2,500,000,000 sin terabytes de RAM?

La forma de manejar 2 mil millones de elementos sin 8 mil millones de bytes de RAM es no mantener la matriz en la memoria.

Eso significa algoritmos mucho más sofisticados para obtenerlo del sistema de archivos en pedazos.


4
2018-06-28 02:32