2010-04-05 7 views
5

Questa potrebbe essere una domanda stupida, ma la documentazione di Google e MATLAB mi ha deluso. Ho un file binario piuttosto grande (> 10 GB) che ho bisogno di aprire ed eliminare gli ultimi quaranta milioni di byte o giù di lì. C'è un modo per farlo senza leggere l'intero file in memoria in blocchi e stamparlo su un nuovo file? Ci sono volute 6 ore per generare il file, quindi sono preoccupato al pensiero di rileggere il tutto.MATLAB - Elimina elementi di file binari senza caricare l'intero file

EDIT:

Il file è 14,440,000,000 byte di dimensione. Ho bisogno di tagliarlo a 14.400.000.000.

+0

Hai un importo esatto alla fine che desideri eliminare? Potresti leggerlo in parti- colare, e poi smettere di leggere ad un certo punto? Presumo che questo sia un file di dati: ha un EOF o qualche altro indicatore che lo stream è completo? – mmr

+0

Sì, conosco l'importo esatto che voglio cancellare. Da quanto tempo è necessario per generare il file, leggerlo in parti- colare richiederà il tempo necessario a rendere di nuovo l'intero file, quindi no. Sì, ha un eof. – Doresoom

risposta

4

Ho trovato che Perl è molto più veloce a farlo rispetto a MATLAB.

Ecco due esempi: Perl Cookbook

truncate(HANDLE, $length) 
    or die "Couldn't truncate: $!\n"; 

truncate("/tmp/$$.pid", $length) 
    or die "Couldn't truncate: $!\n"; 

è possibile eseguire script Perl da MATLAB con PERL la funzione.

+0

Questa sembra la soluzione perfetta --- ma non l'ho ancora testata. – Jacob

+0

In realtà preferisco la soluzione di Andrew. Più naturale per MATLAB. – yuk

+1

... e ora ho deciso di imparare Perl. Sembra abbastanza utile. – Doresoom

2

Poiché non si desidera leggere il file in MATLAB (comprensibilmente), si tratta di comandi a livello di sistema. MATLAB ha la caratteristica di chiamare comandi di sistema utilizzando il "sistema" di comando

system

Così ora il problema si riduce a trovare il comando di shell nel vostro sistema operativo che lo farà per voi. Oppure puoi scrivere un programma usando truncate() (unix - KennyTM) o SetEndOfFile (windows)

5

Non c'è ftruncate() in Matlab, ma è possibile accedere alla libreria standard Java completa nella JVM incorporata in Matlab e utilizzare java.io.RandomAccessFile o le classi Java NIO per troncare un file.

Ecco una funzione di Matlab che chiama su Java per ritagliare gli ultimi n byte da un file. Dovrebbe avere un costo I/O minimo.

function remove_last_n_bytes_from_file(file, n) 

jFile = java.io.RandomAccessFile(file, 'rw'); 
currentLength = jFile.length(); 
wantLength = currentLength - n; 
fprintf('Truncating file %s: Resizing to %d to remove %d bytes\n', file, wantLength, n); 
jFile.setLength(wantLength); 
jFile.close(); 

Si potrebbe anche fare come one-liner.

java.io.RandomAccessFile('/path/to/my/file.bin', 'rw').setLength(n); 
+0

Wow, funziona alla grande! Ho provato solo l'ultimo one-liner su> 4GB file. – yuk

+0

+1 - Funziona alla grande, ma ho appena ottenuto la soluzione di yuk lavorando circa 5 minuti prima di pubblicare. Grazie comunque! – Doresoom