2012-04-25 14 views
6

Tengo una matriz dispersa que parece ser demasiado grande para manejar eficazmente en la memoria (2000x2500000, flotante). Puedo formarlo en un lil_array disperso (scipy) pero si intento generar una matriz escasa comprimida de columna o fila (A.tocsc(), A.tocsr()) mi máquina se queda sin memoria (y también hay una falta de coincidencia seria entre los datos en un archivo de texto 4.4G y la matriz lil pickelada 12G - sería bueno tener un formato de disco que se aproxime más al tamaño de los datos brutos).Grande en la matriz de discos para numpy

Probablemente tendré que manipular matrices aún más grandes en el futuro.

Pregunta: ¿Cuál es la mejor manera de manejar grandes matrices de discos de forma que pueda usar las funciones normales de numpy de forma transparente? Por ejemplo, sumas a lo largo de filas y columnas, productos vectoriales, max, min, slicing, etc.

¿Es el camino a seguir? ¿hay una capa de middleware sql-numpy buena (rápida)? un secreto en la matriz de discos integrado en numpy?

En el pasado con matrices (un poco más pequeñas), siempre acababa de almacenar en caché los resultados largos calculados en el disco. Esto funciona cuando las matrices terminan siendo < 4G más o menos, pero no es sostenible.

+0

Cuando seleccionó su matriz, ¿se aseguró de usar el protocolo binario? Si está utilizando el protocolo de texto predeterminado, esta podría ser la causa del enorme tamaño del archivo. – DaveP

Respuesta

2

A menudo uso memory-mapped numpy arrays para procesar matrices numéricas de varios gigabytes. Encuentro que funcionan muy bien para mis propósitos. Obviamente, si el tamaño de los datos excede la cantidad de RAM, hay que tener cuidado con los patrones de acceso para evitar thrashing.

+0

Esto podría ser factible, pero parece bastante ineficiente para matrices dispersas. ¿Hay una versión escasa? –

+0

@AnthonyBak: No es que yo sepa. Sin embargo, una matriz de 2000x100000 de 'float32' tiene solo 800 MB de tamaño (tanto en disco como en memoria). – NPE

+0

Sí, hubo un error tipográfico en mi pregunta original. Debería haber dicho 2000x2500000. –