Matrices muy grandes usando Python y NumPy
NumPy es una biblioteca extremadamente útil y, al usarla, descubrí 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 (intentar crear una matriz de 50000 x 50000). falla). Obviamente, esto se debe a los enormes requisitos de memoria.
¿Existe alguna manera de crear matrices enormes de forma nativa en NumPy (digamos 1 millón por 1 millón) de alguna manera (sin tener varios terrabytes de RAM)?
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 suelen obtener una compresión 10x, lo cual resulta ú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 puede procesar datos haciendo una agregación GROUP BY similar a SQL a 1.000.000 de filas/segundo. ¡Nada mal para una solución basada en Python!
Acceder nuevamente a los datos como una repetición de NumPy es tan simple como:
data = table[row_from:row_to]
La biblioteca HDF se encarga de leer los fragmentos de datos relevantes y convertirlos a NumPy.
numpy.array
Los s están destinados a vivir en la memoria. Si desea trabajar con matrices más grandes que su RAM, debe solucionarlo. Hay al menos dos enfoques que puede seguir:
- Pruebe una representación matricial más eficiente que aproveche cualquier estructura especial que tengan sus matrices. Por ejemplo, como ya han señalado otros, existen estructuras de datos eficientes para matrices dispersas (matrices con muchos ceros), como
scipy.sparse.csc_matrix
. - Modifique su algoritmo para que funcione con submatrices . Puede leer desde el disco sólo los bloques de matriz que se están utilizando actualmente en los cálculos. Los algoritmos diseñados para ejecutarse en clústeres generalmente funcionan en bloques, ya que los datos se distribuyen entre diferentes computadoras y se pasan solo cuando es necesario. Por ejemplo, el algoritmo de Fox para la multiplicación de matrices (archivo PDF) .
Debería poder utilizar numpy.memmap para asignar en memoria un archivo en el disco. Con Python más nuevo y una máquina de 64 bits, debería tener el espacio de direcciones necesario, sin cargar todo en la memoria. El sistema operativo debe manejar solo mantener parte del archivo en la memoria.
Para manejar matrices dispersas, necesita el scipy
paquete que se encuentra encima numpy
; consulte aquí para obtener más detalles sobre las opciones de matrices dispersas que scipy
le ofrece.