【问题标题】:seek in compressed file在压缩文件中查找
【发布时间】:2015-07-07 16:10:02
【问题描述】:

我有大约 200GB 的文本文件。
我将 key - position_in_file 存储在 DB 对中,
并使用fseek 获取数据。

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

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

【问题讨论】:

  • 可能不会。如果是的话,它不会比解压缩文件并访问那里的内容花费更少的时间。原因:要在压缩文件中找到一个位置,您实际上必须解压缩它而不生成输出,直到到达所需位置。
  • 不是压缩整个文件,而是单独压缩单独的数据块,然后你仍然可以像现在一样使用文件中的位置和搜索。
  • 每个数据块大约1KB-1MB。你建议gzip他们每个人分开吗?
  • @nv3:当您有千兆字节的压缩数据时,查找压缩数据并进行部分解压缩(如果您的压缩格式支持的话)可以减少 很多 时间.支持查找和部分解压缩的两种格式是bzip2 和连接的gzip 块。
  • 是的,这是我的建议,但不是通过调用任何外部 gzip 二进制当然,使用例如zlib。当然,当需要解压缩特定数据块时,需要权衡更长的延迟,但如果您对未压缩数据进行某种缓存,则可以克服大部分问题。

标签: c compression seek


【解决方案1】:

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

【讨论】:

  • 看起来像我需要的。
  • FWIW:我在 zlib 的 zran.c 上开发了一个命令行工具,它为 gzip 文件创建索引:github.com/circulosmeos/gztool 它甚至可以为仍在增长的 gzip 文件创建索引(例如由 rsyslog 直接以 gzip 格式创建的日志),从而在实践中将创建索引的时间减少到零。请参阅 -S(监督)选项。
【解决方案2】:

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

标准的gunzip 程序能够成功解压缩两个或多个.gz 文件的串联。因此,您可以分块压缩文件,并建立一个索引,告诉您在哪里寻找“分块”gzip 文件以开始解压缩。

例如,如果我有一个(人工很小的)数据库

a    apple
b    beneficial
c    carotene
d    diatomaceous

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

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 程序有一些内置的功能,但我不记得细节了。

【讨论】:

  • 我会调查bzip2。谢谢
猜你喜欢
  • 2020-05-24
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2020-07-16
  • 2012-01-29
相关资源
最近更新 更多