在压缩文件中查找

seek in compressed file

我有 ≈ 200GB 的文本文件。
我在数据库中存储 key - position_in_file,
并使用 fseek.

获取数据

有没有推荐的压缩文件的方法,
并在压缩文件中定位,
无需从文件开头解压。

[我更喜欢用C作为语言]
[无需执行写入。不需要超快]

我知道有两种方法可以做到这一点。

标准 gunzip 程序能够成功解压缩两个或多个 .gz 文件的串联。所以你可以将文件压缩成块,并建立一个索引,告诉你从哪里开始解压缩 "chunked" gzip 文件。

例如,如果我有(人工微型)数据库[​​=17=]

a    apple
b    beneficial
c    carotene
d    diatomaceous

如果我不压缩,我可以构建一个 table 键并寻找如下所示的偏移量:

a    0
b    8
c    21
d    32

如果我想制作一个块压缩文件,使用大小为两行的块,我可以这样做(在 shell 中,而不是 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 程序内置了一些功能,但我不记得细节了。

这是一个example of random access of deflated data。它遍历压缩数据一次以构建一个随机访问索引,入口点大约每 1 MB 未压缩数据。 (您可以更改该密度。)每个入口点都位于放气块边界,并保存其前面的 32K 未压缩数据,以便填充滑动字典以进行解压缩。