2012-02-03 23 views
9

Ho un file MATLAB di grandi dimensioni (150 MB) in formato matrice (ad esempio 4070x4070). Ho bisogno di lavorare su questo file in MATLAB ma non riesco a caricare questo file. Sto ottenendo un errore "memoria esaurita". C'è un altro modo in cui posso caricare questa dimensione del file? Sto usando un processore a 32 bit e ho 2 GB di RAM. Per favore aiutami, mi sto stancando di affrontare questo problema.Come posso caricare file di grandi dimensioni (~ 150 MB) in MATLAB?

+4

È un formato di file * .mat o qualche altro formato? – hatboyzero

+1

Sono molto sorpreso che un file da 150 MB possa riempire 2 GB di memoria quando viene aperto! Quanta memoria libera ha la tua macchina prima di provare a caricare? Ci sono altri programmi che potresti chiudere? – japreiss

+0

Se questo è un file .mat, anche 'whos -file ' causerà problemi o semplicemente 'caricherà'? Se non è un file .mat, c'è il testo dell'intestazione? –

risposta

3

Se si tratta di un file immagine e si desidera lavorarci, provare lo matlab block processing. Usandolo, caricherete piccole parti del file. La tua funzione fun verrà applicata a ciascun blocco singolarmente.

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

Nel caso in cui si tratta di un file di xml, provare la modalità XML DOM Node insieme SAX - (Grazie a @Nzbuu per la segnalazione), ma che sembra essere una funzionalità non documentata.

Inoltre, se si tratta di un file di testo di qualsiasi tipo (improbabile, a causa della quantità di dati), provare lo strumento esterno per dividere.

+1

DOM XML legge l'intero file in memoria per primo, in modo che non ti aiuti qui; SAX trasmette l'XML e solleva gli eventi per elaborare i dati. Inoltre, ho trovato l'elaborazione degli oggetti DOM in MATLAB per essere lento. – Nzbuu

+0

@ Nzbuu, grazie. Per qualche ragione, penso che Matlab usi sempre SAX. Ricerca rapida su google ha rivelato che hai ragione. –

+0

Penso che usi SAX per creare un albero DOM. – Nzbuu

11

Starting dalla versione R2011b (versione 7.13) è disponibile un nuovo oggetto matlab.io.MatFile con MATFILE come costruttore. Permette di caricare e salvare parti di variabili nei file MAT. Vedi la documentazione per maggiori dettagli. Ecco un semplice esempio per leggere parte di una matrice:

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

Se il file originale non è un file MAT, ma alcuni file di testo, si può leggere in parte e utilizzare matfile per salvare quelle parti alla stessa variabile in un file MAT per un accesso successivo. Ricorda solo di impostare la proprietà Writable su true nel costruttore.

Assumendo che il file di testo è delimitato da tabulazioni e contiene solo numeri, qui è uno script di esempio per leggere i dati dai blocchi e salvarli in un file 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 

Non ho l'ultima release ora per testare, ma spero che dovrebbe funzionare.

1

È possibile anche utenti MATLAB di Memory-Mapping of Data Files di leggere in un blocco di file, processi, e procedere al successivo blocco senza dover caricare l'intero file in memoria in una sola volta.

Ad esempio, vedere this example, che "esegue il mapping di un file di 100 numeri a virgola mobile a precisione doppia in memoria."

+0

Ho provato questo oggetto nella versione precedente quando è appena apparso in MATLAB. È interessante notare che MATLAB ha dovuto caricare l'intero file nella memoria comunque. Ho contattato il supporto di Mathworks e lo hanno confermato.Fondamentalmente hanno promosso questa funzione come capacità di condividere i dati tra diverse applicazioni allo stesso tempo. Bene, sembra che le cose siano cambiate. L'ho provato di nuovo con R2011a e l'oggetto 'memmapfile' occupa solo 300b. Bella risposta. +1. Il file deve avere una struttura regolare per questo oggetto (solo binari?), Quindi il file di input dovrà probabilmente essere comunque riformattato. – yuk

Problemi correlati