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

Java MATLAB-删除二进制文件的元素而不加载整个文件,java,perl,matlab,binaryfiles,truncate,Java,Perl,Matlab,Binaryfiles,Truncate,这可能是一个愚蠢的问题,但谷歌和MATLAB文档让我失望。我有一个相当大的二进制文件(>10GB),需要打开并删除最后大约4000万字节。有没有一种方法可以做到这一点,而无需将整个文件分块读取到内存中,然后打印到新文件中?生成文件花了6个小时,所以一想到要重读整件事,我就畏缩 编辑: 该文件的大小为14440000000字节。我需要将其拆分为14400000000。我不知道MATLAB是否支持此功能,但请参见。由于您不想将文件读入MATLAB(可以理解),因此您正在处理系统级命令。MATLAB有

这可能是一个愚蠢的问题,但谷歌和MATLAB文档让我失望。我有一个相当大的二进制文件(>10GB),需要打开并删除最后大约4000万字节。有没有一种方法可以做到这一点,而无需将整个文件分块读取到内存中,然后打印到新文件中?生成文件花了6个小时,所以一想到要重读整件事,我就畏缩

编辑:


该文件的大小为14440000000字节。我需要将其拆分为14400000000。

我不知道MATLAB是否支持此功能,但请参见。

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


因此,现在您的问题归结为在操作系统中查找shell命令,它将为您完成此任务。或者您可以使用truncate()(unix--KennyTM)或SetEndOfFile(windows)编写一个程序。

我发现Perl比MATLAB快得多

以下是以下两个例子:

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

MATLAB中没有ftruncate(),但是您可以访问嵌入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();
你也可以做一个班轮

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

您是否在要删除的末尾有确切的金额?你能把它逐段读一遍,然后在某一点停止阅读吗?我假设这是一个数据文件——它是否有一个EOF或其他指示流是否已完成的指标?是的,我知道要删除的确切数量。从生成文件所需的时间来看,分段读取文件所需的时间与重新生成整个文件所需的时间一样长,所以不。是的,它确实有一个eof。这听起来是一个完美的解决方案——但我还没有测试过它。实际上,我更喜欢Andrew的解决方案。对MATLAB来说更自然……现在我决定学习Perl。似乎非常有用。我刚刚发现,如果使用文件名(而不是文件句柄)作为参数,truncate对超过4GB的文件(WinXP)不起作用。嗯,很有意思。哇,真是太棒了!我只测试了>4GB文件上的最后一行程序。+1-这非常有效,但我在发布前5分钟让yuk的解决方案正常工作。无论如何谢谢你!
java.io.RandomAccessFile('/path/to/my/file.bin', 'rw').setLength(n);