これはばかげた質問かもしれませんが、GoogleとMATLABのドキュメントは私に失敗しました。かなり大きなバイナリファイル(> 10 GB)があり、最後の4,000万バイト程度を開いて削除する必要があります。ファイル全体をチャンクでメモリに読み込んで新しいファイルに出力せずにこれを行う方法はありますか?ファイルの生成に6時間かかったので、全部読み直そうと思っています。
編集:
ファイルのサイズは14,440,000,000バイトです。14,400,000,000に切り刻む必要があります。
これはばかげた質問かもしれませんが、GoogleとMATLABのドキュメントは私に失敗しました。かなり大きなバイナリファイル(> 10 GB)があり、最後の4,000万バイト程度を開いて削除する必要があります。ファイル全体をチャンクでメモリに読み込んで新しいファイルに出力せずにこれを行う方法はありますか?ファイルの生成に6時間かかったので、全部読み直そうと思っています。
編集:
ファイルのサイズは14,440,000,000バイトです。14,400,000,000に切り刻む必要があります。
Matlabにはftruncate()はありませんが、Matlabに埋め込まれたJVMの完全なJava標準ライブラリにアクセスでき、java.io.RandomAccessFileまたはJavaNIOクラスを使用してファイルを切り捨てることができます。
これは、Javaを呼び出してファイルから最後のnバイトを削除するMatlab関数です。I/Oコストを最小限に抑える必要があります。
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();
ワンライナーとしてもできます。
java.io.RandomAccessFile('/path/to/my/file.bin', 'rw').setLength(n);
PerlはMATLABよりもはるかに高速であることがわかりました。
Perlクックブックの2つの例を次に示します。
truncate(HANDLE, $length)
or die "Couldn't truncate: $!\n";
truncate("/tmp/$$.pid", $length)
or die "Couldn't truncate: $!\n";
あなたはPERL関数でMATLABからPerlスクリプトを実行することができます。
(当然のことながら)ファイルをMATLABに読み込みたくないので、システムレベルのコマンドを処理しています。MATLABには、「system」コマンドを使用してシステムコマンドを呼び出す機能があります。
だから今あなたの問題はあなたのためにそれをするあなたのOSでシェルコマンドを見つけることに減ります。または、truncate()(unix --KennyTM)またはSetEndOfFile(windows)を使用してプログラムを作成することもできます。
MATLABがこれをサポートしているかどうかはわかりませんが、とを参照ftruncate()
してtruncate()
ください。