2015-07-07 7 views
1

У меня есть текстовые файлы весом ≈ 200 ГБ.
Я храню в парах DB key - position_in_file,
и достигает данных, используя fseek.искать в сжатом файле

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

[Я предпочитаю использовать C как язык]
[Нет необходимости выполнять записи. Не нужно быть супер быстрым]

+0

Труба через почтовый индекс? – Olaf

+0

Наверное, нет. И если да, это займет не меньше времени, чем разжатие файла и доступ к нему. Причина. Чтобы найти позицию в сжатом файле, вам практически необходимо разжать ее без генерации вывода до тех пор, пока вы не достигнете желаемой позиции. – nv3

+0

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

ответ

2

Адрес example of random access of deflated data. Он выполняет сжатые данные один раз, чтобы создать индекс произвольного доступа с точками входа примерно на 1 МБ несжатых данных. (Вы можете изменить эту плотность.) Каждая точка входа находится на границе блока дефляции и сохраняет 32K несжатых данных, которые предшествуют ей, чтобы заполнить скользящий словарь для декомпрессии.

+0

Похож на то, что мне нужно. –

1

Я знаю два способа сделать это.

Стандартная программа 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 имеет некоторые возможности для этого встроенного устройства, но я не помню деталей.

+0

Я буду смотреть в 'bzip2'. Thanks –

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