在压缩的有序固定宽度文件中搜索

时间:2010-04-23 23:42:09

标签: file file-io compression gzip fixed-width

假设我有一个在其中一个字段上排序的常规固定宽度文件。鉴于我知道记录的长度,我可以使用lseek实现二进制搜索,以查找具有与给定值匹配的字段的记录,而无需读取整个文件。

现在困难在于文件是gzip压缩的。是否可以在不完全膨胀文件的情况下执行此操作?如果不是用gzip。有没有支持这种行为的压缩?

6 个答案:

答案 0 :(得分:3)

bzip2文件格式由多个独立压缩的块组成。 如果您愿意在bzip2文件旁边维护索引,那么您可以 知道去哪儿。

注意:这是问题的重复:

这些回答相同的问题,但也将BGZF识别为兼容gzip的输出格式,并插入同步点以重置压缩状态。

答案 1 :(得分:2)

使用zip和衍生文件压缩的​​文件完全不可能。这些基于滚动字典窗口,通常对输出代码的最高有效位进行某种基于缓冲区的压缩。最重要的是,如果没有上下文,zip文件中的特定字节序列就毫无意义。

如果您希望能够从压缩文件中随机读取特定记录,则必须单独压缩每个记录,然后在文件中添加索引。根据您的数据,这可能会使压缩步骤变得毫无价值。

答案 2 :(得分:1)

几乎所有压缩算法我都知道在阻止模式中工作,这意味着无法进行随机搜索。即使不使用初始字典的LZMA也需要顺序解压缩。

流压缩通常意味着自适应有损压缩,其中一些键可以重置状态(或实际切换为块)。细节更复杂。

现在有几个想法可以解决这个问题:

  • 创建索引:就像打开ZIP时一样,您可以看到其中的所有文件
  • 压缩文件剪切成块,然后在每个块中使用二进制搜索(实际上与第一个块类似)
  • 在内存中解压缩但实际上丢弃了所有数据,直到找到了您要查找的数据的开头。

最后一种方法适用于小型压缩文件,而block方法适用于较大的压缩文件。您可以混合这两者。

PS:在输入中修复,并不意味着将修复压缩文件。所以这是一个非常无用的信息。

答案 3 :(得分:1)

Wernight said的基础上,您可以在将其压缩之前将文件拆分为多个固定大小的子文件。您的二进制搜索可以通过搜索包含该范围的子文件开始,然后它只需要解压缩小子文件而不是整个事件。您可以通过在存档中创建包含每个子文件的第一行的上级文件来进行优化。

答案 4 :(得分:1)

继续讨论Liudvikas Bukys所说的内容:如果您的压缩块具有唯一标头,则不需要索引。这类似于在某些压缩视频格式中进行搜索的方式。你寻求一个点,寻找下一个标题。这确实需要强大的验证(使用校验和),因为可能存在错误识别。

答案 5 :(得分:1)

你想要的是可寻求的压缩; dict服务器有dictzip,格式与gzip兼容,因为它可以在头文件中的gzip扩展中存储它,而侦听工具包有sgzip,而不是因为它在每个块的开头存储块长度