MATLAB - Удалите элементы двоичных файлов, не загружая весь файл

Это может быть глупым вопросом, но Google и документация MATLAB привели меня к сбою. У меня есть довольно большой двоичный файл (> 10 ГБ), что я должен открыть и удалить последние сорок миллионов байтов или около этого. Существует ли способ сделать это, не читая весь файл в память в блоках и распечатывая его в новый файл? Потребовалось 6 часов для генерации файла, таким образом, я съеживаюсь при мысли о перечитывании всего этого.

Править:

Файл составляет 14 440 000 000 байтов в размере. Я должен прервать его к 14,400,000,000.

5
задан Amro 28 August 2012 в 14:00
поделиться

4 ответа

Я обнаружил, что Perl делает это намного быстрее, чем MATLAB.

Вот два примера из Поваренная книга Perl :

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

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

Вы можете запустить сценарий Perl из MATLAB с функцией PERL .

4
ответ дан 13 December 2019 в 19:24
поделиться

В Matlab нет ftruncate (), но у вас есть доступ к полной стандартной библиотеке Java в JVM, встроенной в Matlab, и можно использовать java. .io.RandomAccessFile или классы Java NIO для усечения файла.

Вот функция Matlab, которая вызывает Java для удаления последних n байтов из файла. Должны иметь минимальную стоимость ввода-вывода.

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);
5
ответ дан 13 December 2019 в 19:24
поделиться

Поскольку вы не хотите читать файл в MATLAB (что вполне понятно), вы имеете дело с командами системного уровня. В MATLAB есть возможность вызова системных команд с помощью команды "system"

system

Так что теперь ваша проблема сводится к поиску команды оболочки в вашей ОС, которая сделает это за вас. Или вы можете написать программу, используя truncate() (unix -- KennyTM) или SetEndOfFile (windows)

2
ответ дан 13 December 2019 в 19:24
поделиться

Я не знаю, поддерживает ли это MATLAB, но смотрите ftruncate() и truncate().

0
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: