在压缩文件中查找
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 未压缩数据,以便填充滑动字典以进行解压缩。
我有 ≈ 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 未压缩数据,以便填充滑动字典以进行解压缩。