Tengo un enorme tensor 3D numpy que está almacenado en un archivo en mi disco (que normalmente leo usando np.load ). Este es un archivo .npy binario. Al usar np.load , rápidamente termino usando la mayor parte de mi memoria.
Afortunadamente, en cada ejecución del programa, solo necesito una cierta porción del enorme tensor. La rebanada es de un tamaño fijo y sus dimensiones se proporcionan desde un módulo externo.
¿Cuál es la mejor manera de hacer esto? La única forma en que pude averiguarlo es almacenar de alguna manera esta matriz numpy en una base de datos MySQL. Pero estoy seguro de que hay formas mucho mejores / más fáciles. También estaré feliz de construir mi archivo de tensor 3D de manera diferente si ayuda.
¿Cambia la respuesta si mi tensor es de naturaleza escasa?
use numpy.load normalmente, pero asegúrese de especificar la palabra clave mmap_mode para que la matriz se mantenga en el disco y solo los bits necesarios se carguen en la memoria al acceder.
mmap_mode : {Ninguno, 'r+', 'r', 'w+', 'c'}, opcional Si no es Ninguno, entonces mapee en memoria el archivo, usando el modo dado (vea numpy.memmap para una descripción detallada de los modos ). Una matriz mapeada en memoria se mantiene en el disco. Sin embargo, se puede acceder a él y dividirlo como cualquier ndarray. El mapeo de memoria es especialmente útil para acceder a pequeños fragmentos de archivos grandes sin leer todo el archivo en la memoria.
Los modos se describen en numpy.memmap :
modo: {'r+', 'r', 'w+', 'c'}, opcional El archivo se abre en este modo: 'r' Abre el archivo existente solo para lectura. 'r+' Abre un archivo existente para lectura y escritura. 'w+' Crea o sobrescribe un archivo existente para lectura y escritura. 'c' Copia en escritura: las asignaciones afectan los datos en la memoria, pero los cambios no se guardan en el disco. El archivo en el disco es de solo lectura.
*Asegúrese de no usar el modo 'w+', ya que borrará el contenido de su archivo.