这可能是一个愚蠢的问题,但谷歌和 MATLAB 文档让我失望了。我有一个相当大的二进制文件(> 10 GB),我需要打开并删除最后四千万字节左右。有没有办法做到这一点,而无需将整个文件分块读取到内存中并将其打印到新文件中?生成文件花了 6 个小时,所以一想到要重新阅读整个文件,我就感到畏缩。
编辑:
该文件的大小为 14,440,000,000 字节。我需要把它砍到 14,400,000,000。
这可能是一个愚蠢的问题,但谷歌和 MATLAB 文档让我失望了。我有一个相当大的二进制文件(> 10 GB),我需要打开并删除最后四千万字节左右。有没有办法做到这一点,而无需将整个文件分块读取到内存中并将其打印到新文件中?生成文件花了 6 个小时,所以一想到要重新阅读整个文件,我就感到畏缩。
编辑:
该文件的大小为 14,440,000,000 字节。我需要把它砍到 14,400,000,000。
Matlab 中没有 ftruncate(),但是您可以访问 Matlab 中嵌入的 JVM 中的完整 Java 标准库,并且可以使用 java.io.RandomAccessFile 或 Java NIO 类来截断文件。
这是一个调用 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 Cookbook中的两个示例:
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”命令调用系统命令
因此,现在您的问题已简化为在您的操作系统中找到将为您执行此操作的 shell 命令。或者您可以使用 truncate() (unix -- KennyTM) 或 SetEndOfFile (windows) 编写程序
我不知道 MATLAB 是否支持这一点,但请参阅ftruncate()
andtruncate()
。