Просто 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
будет занимать на диске только размер фрагмента! Теперь полный индекс (ранее только -после создания :, например, с помощью 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
Да, это должно быть на удаленном конце. Со страницы man
:
It is famous for its delta-transfer algorithm, which reduces the amount of data sent over the network by sending only the differences between the source files and the existing files in the destination.
Неужели это так сложно проверить?