Dor*_*oom 5 java perl matlab truncate binaryfiles
这可能是一个愚蠢的问题,但谷歌和MATLAB文档让我失望.我有一个相当大的二进制文件(> 10 GB),我需要打开并删除最后四千万字节左右.有没有办法在不将整个文件读取到内存并将其打印到新文件的情况下执行此操作?生成文件花了6个小时,所以我想重新阅读整个文件.
编辑:
该文件的大小为14,440,000,000字节.我需要把它砍成14,400,000,000.
没有ftruncate()在Matlab,但你访问嵌入在Matlab中JVM完整的Java标准库,并且可以使用java.io.RandomAccessFile中或Java NIO类截断文件.
这是一个Matlab函数,它调用Java来删除文件的最后n个字节.应该具有最小的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();
Run Code Online (Sandbox Code Playgroud)
你也可以做一个单行班.
java.io.RandomAccessFile('/path/to/my/file.bin', 'rw').setLength(n);
Run Code Online (Sandbox Code Playgroud)
我发现 Perl 比 MATLAB 执行此操作要快得多。
以下是Perl Cookbook中的两个示例:
truncate(HANDLE, $length)
or die "Couldn't truncate: $!\n";
truncate("/tmp/$$.pid", $length)
or die "Couldn't truncate: $!\n";
Run Code Online (Sandbox Code Playgroud)
您可以使用 PERL函数从 MATLAB 运行 Perl 脚本。