当前位置:  开发笔记 > 编程语言 > 正文

压缩格式对档案内的随机访问有很好的支持?

如何解决《压缩格式对档案内的随机访问有很好的支持?》经验,为你挑选了5个好方法。

这与之前的问题类似,但那里的答案不能满足我的需求,我的问题略有不同:

我目前对一些包含排序数据的非常大的文件使用gzip压缩.当文件未被压缩时,二进制搜索是支持在排序数据中寻找位置的便捷有效方式.

但是当文件被压缩时,事情变得棘手.我最近发现了zlib的Z_FULL_FLUSH选项,可以在压缩过程中使用它在压缩输出中插入"同步点"(inflateSync()然后可以从文件中的各个点开始读取).这是可以的,虽然我已经拥有的文件必须重新压缩才能添加此功能(奇怪的gzip是没有这个选项,但如果必须,我愿意编写自己的压缩程序).

从一个来源看来,即使Z_FULL_FLUSH不是一个完美的解决方案......不仅所有gzip档案都不支持它,而且在档案中检测同步点的想法可能会产生误报(或者与同步的幻数重合)点,或由于Z_SYNC_FLUSH也产生同步点但它们不能用于随机访问的事实.

有更好的解决方案吗?如果可能的话,我想避免使用辅助文件进行索引,并且对准随机访问的显式默认支持将是有帮助的(即使它是大粒度的 - 就像能够以每10 MB的间隔开始读取一样).是否有另一种压缩格式比gzip更好地支持随机读取?

编辑:正如我所提到的,我希望在压缩数据中进行二进制搜索.我不需要寻找特定的(未压缩的)位置 - 只是在压缩文件中寻找一些粗粒度.我只是希望能够支持诸如"将数据从大约50%(25%,12.5%等)开始压缩到此压缩文件中".



1> Ivo Danihelk..:

看看dictzip吧.它与gzip兼容,允许粗随机访问.

摘自其手册页:

dictzip使用gzip(1)算法(LZ77)以与gzip文件格式完全兼容的方式压缩文件.gzip文件格式的扩展(Extra Field,在RFC 1952的2.3.1.1中描述)允许将额外数据存储在压缩文件的头部中.像gzip和zcat这样的程序会忽略这些额外的数据.但是,[dictzcat --start]将利用此数据对文件执行伪随机访问.

我在Ubuntu中有dictzip包.或者它的源代码是在dictd - *.tar.gz中.它的许可证是GPL.你可以自由学习.

更新:

我改进了dictzip没有文件大小限制. 我的实施是在MIT许可下.


我通过使用gzip同步/刷新点解决了我的问题,这让我可以扫描文件(进行二进制搜索).我必须在libz之上编写自己的类似gzip的程序,因为无论出于何种原因标准的gzip都不包括写入同步点的工具.无论如何,这在我的情况下工作得很好,因为我不关心能够"从字节10000开始读取",只是"从文件的大约50%开始读取".dictzip方法看起来非常有趣,并且解决了一个比我更普遍的问题.

2> jpalecek..:

我不知道任何压缩文件格式可以支持随机访问未压缩数据中的特定位置(除了多媒体格式),但你可以酿造自己的.

例如,bzip2压缩文件由大小<1MB未压缩的独立压缩块组成,这些块由魔术字节序列分隔,因此您可以解析bzip2文件,获取块边界,然后只解压缩右块.这需要一些索引来记住块的起始位置.

尽管如此,我认为最好的解决方案是将文件拆分为您选择的块,然后使用zip或rar等一些归档程序压缩它,这些归档程序支持随机访问归档中的各个文件.



3> AardvarkSoup..:

该.xz文件格式(使用LZMA压缩)似乎支持这一点:

随机访问读取:数据可以拆分为独立的压缩块.每个.xz文件都包含块的索引,当块大小足够小时,可以进行有限的随机访问读取.

这应该足以满足您的目的.缺点是liblzma的API(用于与这些容器交互)似乎没有很好的文档,因此可能需要花费一些精力来确定如何随机访问块.


是的,例如,`pixz`用于tar档案成员的随机访问,或nbdkit用于访问xz压缩文件作为nbd设备(例如,能够安装压缩磁盘映像).qcow2(qemu磁盘映像的本机格式)是另一种允许压缩和随机访问的格式.

4> hippietrail..:

存在用于提供对gzip和bzip2档案的随机访问的解决方案:

来自ghostscript源代码的gzip zran.c

詹姆斯泰勒的bzip2 seek-bzip

(我正在寻找7zip的东西)


我感兴趣地阅读了zran代码,特别是考虑到它是由Mark Adler编写的.但它似乎只是一种便利机制:评论说它首先读取整个文件并构建一个索引,后来用于执行随机访问.这对GhostScript来说可能很棒,我想输入文件的大小是兆字节.但我的输入文件大小为千兆字节,所以在进行随机访问之前完全读取它们并不是那么好.更糟糕的是,我最常见的用例恰好是每个打开文件的单个随机访问.

5> bli..:

bgzip可以以gzip可索引的变体形式压缩文件(并可以通过进行解压缩gzip)。在某些生物信息学应用程序中,它与tabix索引器一起使用。

请参阅以下说明:http : //blastedbio.blogspot.fr/2011/11/bgzf-blocked-bigger-better-gzip.html,以及此处:http : //www.htslib.org/doc/tabix.html。

我不知道它在多大程度上适用于其他应用程序。

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有