¿Una manera eficiente de leer parcialmente un archivo de gran tamaño?

Tengo un gran tensor 3D que se almacena en un archivo en mi disco (que normalmente leo con 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 progtwig, solo necesito una cierta porción del enorme tensor. La división 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 de resolverlo es de alguna manera almacenar esta matriz numpy en una base de datos MySQL. Pero estoy seguro de que hay formas mucho mejores / más fáciles. También me complacerá comstackr mi archivo tensor 3D de manera diferente si eso ayuda.


¿Cambia la respuesta si mi tensor es escaso en la naturaleza?

use numpy.load como de costumbre, 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: {Ninguna, ‘r +’, ‘r’, ‘w +’, ‘c’}, opcional Si no es ninguna, entonces mapee en memoria el archivo, usando el modo dado (vea numpy.memmap para una descripción detallada de los modos ). Una matriz asignada en memoria se mantiene en el disco. Sin embargo, se puede acceder y dividir 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 numpy.memmap 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 +’ Abrir archivo existente para leer y escribir. ‘w +’ Crea o sobrescribe un archivo existente para leer y escribir. ‘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.