2010-04-05 2 views
5

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

EDIT:

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

+0

У вас есть точная сумма в конце, которую вы хотите удалить? Не могли бы вы прочитать его кусочком, а затем просто перестать читать в определенный момент? Я предполагаю, что это файл данных - есть ли EOF или какой-либо другой индикатор, что поток завершен? – mmr

+0

Да, я знаю точную сумму, которую хочу удалить. От того, сколько времени потребовалось, чтобы сгенерировать файл, чтение его кусочно займет столько же времени, сколько и весь файл, поэтому нет. Да, у него действительно есть. – Doresoom

ответ

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 функции.

+0

Это звучит как идеальное решение, но я его не тестировал. – Jacob

+0

Мне действительно нравится решение Андрея лучше. Более естественным для MATLAB. – yuk

+1

... и теперь я решил изучить Perl. Кажется довольно полезным. – Doresoom

2

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

system

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

5

В 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); 
+0

Ничего себе, отлично работает! Я тестировал только последний однострочный файл на> 4 ГБ. – yuk

+0

+1 - Это отлично работает, но я только что получил решение yuk, работающее около 5 минут, прежде чем вы отправили сообщение. Спасибо, в любом случае! – Doresoom

Смежные вопросы