Я знаю два способа сделать это.
Стандартная программа gunzip
способна успешно распаковать конкатенацию двух или более файлов .gz
. Таким образом, вы можете сжать файл в кусках и создать индекс, который подскажет вам, где искать файл «chunked» gzip, чтобы начать разжатие.
Например, если бы я имел (искусственно крошечные) базы данных
a apple
b beneficial
c carotene
d diatomaceous
, и если я не сжимать, я мог бы построить таблицу ключей и искать смещения, которые будут выглядеть следующим образом:
a 0
b 8
c 21
d 32
Если бы я хотел, чтобы сделать кусок сжатого файла, используя куски размером две строки, я мог бы сделать это так (в скорлупе, а не C):
sed -n 1,2p d | gzip > d.gz
sed -n 3,4p d | gzip >> d.gz
Мой индекс для порции сжатого файла будет иметь три поля: ключ, попытка перемотать смещение в порции сжатого файла, а также дополнительное смещение (после разжатия), чтобы найти этот ключ в пределах фрагмента:
a 0 0
b 0 8
c 41 0
c 41 11
Программа bzip2
имеет некоторые возможности для этого встроенного устройства, но я не помню деталей.
Труба через почтовый индекс? – Olaf
Наверное, нет. И если да, это займет не меньше времени, чем разжатие файла и доступ к нему. Причина. Чтобы найти позицию в сжатом файле, вам практически необходимо разжать ее без генерации вывода до тех пор, пока вы не достигнете желаемой позиции. – nv3
Вместо сжатия всего файла сжимайте отдельные блоки данных отдельно, тогда вы все равно можете использовать позицию в файле и искать, как сейчас. –