Чтение частично загруженного gzip со смещением

Можете ли вы начать с вывода env | grep LANG ? Убедитесь, что все они указывают на правильный язык / страну, затем выполните команду dpkg, как указано в @vlp

3
09.03.2018, 11:41
2 ответа

gzipне создает блочные -сжатые файлы (подробности см. в RFC ), поэтому сам по себе он не подходит для произвольного доступа. Вы можете начинать чтение из потока и останавливаться, когда захотите, поэтому ваш пример curl -r 0-2024работает, но вы не можете выбрать поток в середине, если у вас нет дополнительного файла для предоставления недостающих данных (например, индексные файлы, созданныеgztool).

Чтобы достичь того, что вы пытаетесь сделать, вам нужно использовать какое-то блочное сжатие; напр. bgzip(, который создает файлы, которые могут быть распакованы простымgzip)или bzip2, и выполняет некоторую работу на принимающей стороне, чтобы определить, где лежат границы блока. Питер Кок написал несколько интересных постов на эту тему:BGZF -Заблокировано, больше и лучше GZIP! , Произвольный доступ к BZIP2?

4
27.01.2020, 21:21

Просто FWIW, gzip может быть доступен случайным образом, если был создан предыдущий индексный файл...

Я разработал инструмент командной строки, который может быстро и (почти -)произвольно обращаться к gzip, если указан индекс (если он не предоставлен, он создается автоматически):

https://github.com/circulosmeos/gztool

gztoolможно использовать для доступа к фрагментам исходного файла gzip, если эти фрагменты извлекаются в определенных точках байтов, на которые индекс указывает (-1 байт, чтобы быть уверенным, потому что gzip — это поток битов, а не байтов ), а лучше после них.

Например, , если начинается индексная точка,(gztool -ll index.gziпредоставляет эти данные )в сжатом -байте 1508611 файла gzip, и после этого нам нужен 1M сжатых байтов:

$ curl -r 1508610-2508611 https://example.com/db/backups/db.sql.gz > chunk.gz
  • Обратите внимание, что chunk.gzбудет занимать на диске только размер фрагмента!
  • Также обратите внимание, что это не действительный файл gzip, так как он неполный.
  • Также учтите, что мы получили из нужного индекса -позицию точки -минус 1 байт.

Теперь полный индекс (ранее только -после создания :, например, с помощью gztool -i *.gzдля создания индексов для всех ваших уже сжатых файлов или gztool -c *для сжатия и создания индекса )должен также быть извлечены. Обратите внимание, что индексы составляют ~0,3% от размера gzip (или намного меньше, если gztoolсжимает сами данные ).

$ curl https://example.com/db/backups/db.sql.gzi -o chunk.gzi

Теперь извлечение можно выполнить с помощью gztool . Должен быть известен соответствующий несжатый байт (или переданный байт )из сжатых -1508610, но индекс может показать эту информацию с помощью gztool -ll. См. примеры здесь . Предположим, что это байт 9009009. Или несжатый байт, который нам нужен, просто передается соответствующей первой индексной точке, содержащейся в chunk.gz. Давайте снова предположим, что этот байт также будет 9009009 для этого случая.

$ gztool -n 1508610 -b 9009009 chunk.gz > extracted_chunk.sql

gztoolпрекратит извлечение данных, когда закончится файл chunk.gz.

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


ПРИМЕЧАНИЯ:Другой способ выполнить извлечение без использования параметра -n— заполнить gzip-файл разреженными нулями :это делается для примера с командой ddперед сначала curlдля извлечения файла chunk.gz, поэтому:

$ dd if=/dev/zero of=chunk.gz seek=1508609 bs=1 count=0
$ curl -r 1508610-2508611 https://example.com/db/backups/db.sql.gz >> chunk.gz
$ curl https://example.com/db/backups/db.sql.gzi -o chunk.gzi

Таким образом, первые 1508609 байт файла являются нулями, но они не занимают места на диске . Без seekв команде ddвсе нули записываются на диск, что будет справедливо и для gzip, но таким образом мы не занимаем лишнее место на диске. Тогда команде gztool не нужен параметр -n. Обнуление данных не требуется, потому что, поскольку индекс существует, gztoolбудет использовать его для перехода к точке индекса непосредственно перед несжатой позицией 9009009 байт, поэтому все предыдущие данные просто игнорируются:

$ gztool -b 9009009 chunk.gz > extracted_chunk.sql
2
27.01.2020, 21:21

Теги

Похожие вопросы