Это может быть глупым вопросом, но Google и документация MATLAB привели меня к сбою. У меня есть довольно большой двоичный файл (> 10 ГБ), что я должен открыть и удалить последние сорок миллионов байтов или около этого. Существует ли способ сделать это, не читая весь файл в память в блоках и распечатывая его в новый файл? Потребовалось 6 часов для генерации файла, таким образом, я съеживаюсь при мысли о перечитывании всего этого.
Править:
Файл составляет 14 440 000 000 байтов в размере. Я должен прервать его к 14,400,000,000.
Я обнаружил, что 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 .
В 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);
Поскольку вы не хотите читать файл в MATLAB (что вполне понятно), вы имеете дело с командами системного уровня. В MATLAB есть возможность вызова системных команд с помощью команды "system"
Так что теперь ваша проблема сводится к поиску команды оболочки в вашей ОС, которая сделает это за вас. Или вы можете написать программу, используя truncate() (unix -- KennyTM) или SetEndOfFile (windows)
Я не знаю, поддерживает ли это MATLAB, но смотрите ftruncate()
и truncate()
.