У нас есть много сжатых данных, которые на самом деле представляют собой сжатый записанный в архив архив каталогов и его подкаталогов, содержащих XML-файлы; напримерМожете ли вы передать файл в файл, строка за строку из архива .tar.bz2 в Perl?
omega/
- alpha/
- a/
- file1.xml
- file2.xml
- file3.xml
- b/
- file1.xml
- file2.xml
- file3.xml
- c/
- ...
- beta/
- a/
- file1.xml
- file2.xml
- file3.xml
- b/
- ...
- c/
- ...
- gamma/
- a/
- ...
- b/
- ...
- c/
- ...
В результате были бы такие файлы, как omega.tar.bz2
и эти файлы могут достигать размера в сотни гигабайт.
Несмотря на то, что мы знаем, что это файл , было бы неплохо по-прежнему использовать его содержимое, когда нам нужно. Поэтому мне было интересно, можно ли читать из этих файлов в Perl потоковым образом, то есть без предварительной распаковки и распаковки всего на диске или без необходимости загружать файл *.tar.bz2
в память.
Я знаю, что с IO::Uncompress
вы можете Bunzip2, но насколько я могу видеть и протестировать, это будет читать весь файл в памяти, который невозможен с нашими большими файлами. Пример кода ниже для Bunzipping (не включая TAR).
use strict;
use warnings;
use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
my $filename = '/path/to/file/file1.xml.bz2';
open(my $fh, '<', $filename)
or die "Could not open file '$filename' $!";
my $buffer ;
bunzip2 $filename => \$buffer
or die "bunzip2 failed: $Bunzip2Error\n";
print STDOUT "$buffer\n";
Принимая TAR во внимание, есть также Archive::Extract
модуль, который позволяет читать .tar.bz2
файл (типа tbz
) в качестве Extract Object
, но опять-таки это прочитал бы весь файл в память, которая не возможна с нашими ginormous файлы.
Из-за моих собственных исследований в этой теме я думаю, что маловероятно, чтобы можно было читать TAR BZIP2s потоковым способом, т. Е. Линию на линию. Однако у меня нет опыта сжатия, так что, возможно, есть способ восстановить строки файлов, учитывая количество блоков данных.
Tl; dr: можете ли вы передать содержимое файла (строка-строка или подобное) из сжатого TAR-архива BZIP2?
Благодарим за информацию. Но если вы используете ZIP, разве весь ZIP не должен быть распакован до того, как любой из сжатых файлов будет доступен? Будет ли это похоже на первый bzipping всех файлов и * then * переносить их? –
@BramVanroy: с ZIP файлы сжимаются внутри архива, т. Е. Можно искать конкретный файл, а затем распаковывать его, а не распаковывать все в архиве до этого файла. –