MATLAB - 删除二进制文件的元素而不加载整个文件

时间:2010-04-05 18:48:27

标签: java perl matlab binaryfiles truncate

这可能是一个愚蠢的问题,但谷歌和MATLAB文档让我失望。我有一个相当大的二进制文件(> 10 GB),我需要打开并删除最后四千万字节左右。有没有办法在不将整个文件读取到内存并将其打印到新文件的情况下执行此操作?生成文件花了6个小时,所以我想重新阅读整个文件。

编辑:

该文件的大小为14,440,000,000字节。我需要把它砍成14,400,000,000。

4 个答案:

答案 0 :(得分:5)

Matlab中没有ftruncate(),但您可以访问嵌入在Matlab中的JVM中的完整Java标准库,并且可以使用java.io.RandomAccessFile或Java NIO类来截断文件。 / p>

这是一个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();

您也可以将其作为一个单行。

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

答案 1 :(得分:4)

我发现Perl比MATLAB快得多。

以下是Perl Cookbook中的两个示例:

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

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

您可以使用PERL函数从MATLAB运行Perl脚本。

答案 2 :(得分:2)

由于您不想将文件读入MATLAB(可以理解),因此您正在处理系统级命令。 MATLAB有一个使用“system”命令调用系统命令的工具

system

所以现在您的问题已经减少到在您的操作系统中找到将为您执行此操作的shell命令。或者您可以使用truncate()(unix - KennyTM)或SetEndOfFile(windows)编写程序

答案 3 :(得分:0)

我不知道MATLAB是否支持此功能,但请参阅ftruncate() and truncate()