5

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

编辑:

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

4

4 回答 4

5

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);
于 2010-04-05T21:37:04.953 回答
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 脚本。

于 2010-04-05T19:44:54.973 回答
2

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

系统

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

于 2010-04-05T19:43:39.103 回答
0

我不知道 MATLAB 是否支持这一点,但请参阅ftruncate()andtruncate()

于 2010-04-05T19:31:34.550 回答