2009-07-25 3 views
35

Я хочу подражать функциональности gzcat | хвост -n.Как я могу заархивировать файл без чтения всего его содержимого?

Это было бы полезно в случае, когда есть огромные файлы (из нескольких ГБ или около того). Могу ли я задержать последние несколько строк такого файла без его чтения с самого начала? Я сомневаюсь, что это будет невозможно, поскольку я предполагаю, что для gzip кодировка будет зависеть от всего предыдущего текста.

Но все же я хотел бы услышать, если кто-то попытался сделать что-то подобное - возможно, исследовать алгоритм сжатия, который мог бы обеспечить такую ​​функцию.

+0

GZIP не текстуального но двоичный файл. Таким образом, нет никаких «строк», как в текстовых данных, которые «tail» мог бы вернуть. – Gumbo

+0

Возможно, вы захотите проверить [аналогичный вопрос на SO] (http://stackoverflow.com/questions/14225751/random-access-to-gzipped-files), [zlib FAQ] (http://zlib.net) /zlib_faq.html#faq28) и [examples/zran.c] (https://github.com/madler/zlib/blob/master/examples/zran.c) в [zlib] (http: // zlib. net) распределение. –

ответ

36

Нет, вы не можете. zipping algorithm работает над потоками и адаптирует свои внутренние кодировки к тому, что содержит поток для достижения высокой степени сжатия.

Не зная, что представляет собой содержимое потока до определенного момента, невозможно узнать, как перейти от сжатия с этой точки.

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

+6

Это отчасти верно, в зависимости от того, как был создан файл. Файлы gzip могут содержать несколько потоков, причем последний полностью не зависит от предыдущих. Вы можете просто объединить файлы gzip вместе и по-прежнему иметь действительный файл gzip. Я не знаю подробностей, но я предполагаю, что можно найти местоположение последнего такого сброса потока, полагая, что все, что написал поток, перезапускается очень часто. – mc0e

3

Если у вас есть контроль над тем, что входит в файл в первую очередь, если это что-то вроде ZIP-файла, вы можете хранить куски заданного размера с именами файлов в порядке возрастания числа, а затем просто распаковывать последний фрагмент/файл.

+3

Это звучит как хороший компромисс. Однако ОП должен знать, что это снизит коэффициент сжатия. Если тестирование показывает, что изменение отношения приемлемо, это отличная идея. –

+1

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

7

BGZF используется для создания сжатых BZ-файлов с индексом gzip, созданных Samtools. Они беспорядочно доступны.

http://samtools.sourceforge.net/

+1

Точно. Однако это не только для samtools или для BAM! Я считаю, что он будет работать для любых данных с разделителями строк. –

+1

Файлы BGZF разрешают доступ к случайным смещениям байтов внутри специально сконструированных gzips, сначала ограничивая размер блока, а затем для каждого блока, сохраняющего его длину в заголовке BC (который gzip игнорирует), чтобы разрешить произвольный доступ без декомпрессии. Такие инструменты, как BAM, сохраняют смещения, сохраняя смещение начала блока, а также смещение внутри блока. Чтобы получить ориентированную на линию индексацию, вам нужно что-то вроде сопутствующего файла бай или tabix (хотя это формат и тип генома), чтобы отобразить из требуемой линии (линий) для смещения. –

1

Если это вариант, то bzip2 может быть лучше алгоритм сжатия, чтобы использовать для этой цели.

Bzip2 использует схему сжатия блоков. Таким образом, если вы берете кусок конца вашего файла, который, как вы уверены, достаточно велик, чтобы содержать весь последний кусок, вы можете восстановить его с помощью bzip2recover.

Размер блока можно выбрать на момент написания файла. На самом деле это то, что происходит, когда вы устанавливаете -1 (или --fast) в -9 (или --best) в качестве параметров сжатия, которые соответствуют размерам блоков от 100 к до 900 тыс. Значение по умолчанию - 900 тыс.

Инструменты командной строки bzip2 не дают вам приятного дружественного способа сделать это с помощью конвейера, но тогда bzip2 не ориентирован на потоки, возможно, это не удивительно.

1

zindex создает и запрашивает индекс сжатого текстового текстового файла в режиме времени и пространства.

https://github.com/mattgodbolt/zindex

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