MATLAB - Удалить элементы двоичных файлов без загрузки всего файла - PullRequest
5 голосов
/ 05 апреля 2010

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

EDIT:

Файл имеет размер 14 440 000 000 байт. Мне нужно нарезать его до 14 400 000 000.

Ответы [ 4 ]

5 голосов
/ 06 апреля 2010

В 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);
4 голосов
/ 05 апреля 2010

Я обнаружил, что 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 .

2 голосов
/ 05 апреля 2010

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

система

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

0 голосов
/ 05 апреля 2010

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

...