2012-02-03 14 views
9

Tengo un gran archivo MATLAB (150 MB) en forma de matriz (es decir, 4070 x 4070). Necesito trabajar en este archivo en MATLAB pero parece que no puedo cargar este archivo. Recibo un error de "falta de memoria". ¿Hay alguna otra forma en que pueda cargar este tamaño de archivo? Estoy usando un procesador de 32 bits y tengo 2 GB de RAM. Por favor, ayúdenme, me estoy cansando de lidiar con este problema.¿Cómo puedo cargar archivos grandes (~ 150MB) en MATLAB?

+4

¿Es un formato de archivo * .mat o algún otro formato? – hatboyzero

+1

¡Estoy muy sorprendido de que un archivo de 150 mb pueda llenar 2 GB de memoria cuando se abra! ¿Cuánta memoria libre tiene tu máquina antes de intentar la carga? ¿Hay algún otro programa que pueda cerrar? – japreiss

+0

Si se trata de un archivo .mat, ¿'whos -file ' también causa problemas, o simplemente 'load'? Si no es un archivo .mat, ¿hay texto de encabezado? –

Respuesta

3

Si se trata de un archivo de imagen, y desea trabajar con él, intente con matlab block processing. Al usarlo, cargará pequeñas partes del archivo. Su función fun se aplicará a cada bloque individualmente.

B = blockproc(src_filename,[M N],fun) 

En caso de que sea un archivo xml, probar el modo XML DOM Node junto con SAX - (Gracias a @Nzbuu por señalarlo), pero que parece ser una funcionalidad no documentada.

Además, si se trata de un archivo de texto de cualquier tipo (Improbable, debido a la cantidad de datos), intente herramienta externa para dividir.

+1

XML DOM lee todo el archivo en la memoria primero, por lo que no lo ayudará aquí; SAX transmite el XML y genera eventos para procesar los datos. Además, he encontrado que el procesamiento de los objetos DOM en MATLAB es lento. – Nzbuu

+0

@Nzbuu, gracias. Por alguna razón, pensé que Matlab siempre usa SAX. La búsqueda rápida en Google reveló que estás en lo correcto. –

+0

Creo que usa SAX para crear un árbol DOM. – Nzbuu

11

Starting desde el release R2011b (ver.7.13) hay un nuevo objeto matlab.io.MatFile con MATFILE como constructor. Permite cargar y guardar partes de variables en archivos MAT. Ver la documentación para más detalles. Aquí está un ejemplo sencillo de leer parte de una matriz:

matObj = matfile(filename); 
a = matObj.a(100:500, 200:600); 

Si el archivo original no es un archivo MAT, pero algunos archivo de texto, se puede leer parcialmente y utilizar matfile para salvar aquellas partes de la misma variable en un archivo MAT para un acceso posterior. Solo recuerda establecer la propiedad Writable en true en el constructor.

Asumiendo que su archivo de texto es delimitado por tabuladores y contiene sólo números, aquí es un script de ejemplo para leer los datos por bloques y guardarlos en el archivo MAT:

blocksize = 100; 
startrow = 0; 
filename = 'test.mat'; 
matObj = matfile(filename,'Writable',true); 
while true 
    try 
     a = dlmread(filename,'\t',startrow,0); %# depends on your file format 
     startrow = startrow + blocksize; 
     matObj.a(startrow+(1:blocksize),:) = a; 
    catch 
     break 
    end 
end 

no tengo la última versión ahora para probar, pero espero que funcione.

1

Puede también usuario de MATLAB de Memory-Mapping of Data Files para leer en un bloque del archivo, procesarla, y proceder al siguiente bloque sin tener que cargar el archivo en la memoria a la vez.

Por ejemplo, consulte this example, que "asigna un archivo de 100 números de punto flotante de precisión doble a la memoria".

+0

He intentado este objeto en versiones anteriores cuando apareció en MATLAB. Curiosamente, MATLAB tuvo que cargar todo el archivo en la memoria de todos modos. Contacté con el soporte de Mathworks y lo confirmaron.Básicamente promovieron esta característica como la capacidad de compartir los datos entre diferentes aplicaciones al mismo tiempo. Bueno, parece que las cosas han cambiado. Lo intenté de nuevo con R2011a y el objeto 'memmapfile' ocupa solo 300b. Buena respuesta. +1. El archivo debe tener una estructura regular para este objeto (¿solo binario?), Por lo que es probable que el archivo de entrada deba formatearse de todos modos. – yuk

Cuestiones relacionadas