首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >压缩格式,良好的支持档案中的随机访问?

压缩格式,良好的支持档案中的随机访问?
EN

Stack Overflow用户
提问于 2009-01-09 22:29:44
回答 10查看 27.3K关注 0票数 68

这与前一个问题类似,但答案不能满足我的需要,我的问题略有不同:

目前,我对一些包含排序数据的非常大的文件使用gzip压缩。当文件未被压缩时,二进制搜索是支持查找排序数据中某个位置的一种方便而有效的方法。

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

一个来源看来,即使是Z_FULL_FLUSH也不是一个完美的solution...not --并非所有gzip存档都支持它,但是在归档中检测同步点的想法可能会产生假阳性(或者与同步点的神奇数字巧合,或者因为Z_SYNC_FLUSH也生成同步点,但它们不能用于随机访问)。

有没有更好的解决办法?如果可能的话,我希望避免为索引设置辅助文件,并且对于准随机访问的显式默认支持是有帮助的(即使它是大粒度的--就像能够在每10 MB的间隔开始读取)。还有比gzip更支持随机读取的压缩格式吗?

编辑:正如我提到的,我希望在压缩的数据中进行二进制搜索。我不需要寻找一个特定的(未压缩的)位置--只需要在压缩文件中寻找一些粗粒度。我只想要支持这样的东西:“解压数据开始大约50% (25%,12.5%,等等)的方式进入这个压缩文件。”

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-01-09 23:19:55

我不知道有任何压缩文件格式可以支持对未压缩数据中特定位置的随机访问(嗯,除了多媒体格式),但是您可以自己编写。

例如,bzip2压缩文件由大小<1MB未压缩的独立压缩块组成,这些块由神奇的字节序列分隔,因此您可以解析bzip2文件,获取块边界,然后解压缩正确的块。这需要一些索引来记住块从哪里开始。

不过,我认为最好的解决方案是将您的文件分割成您选择的部分,然后使用一些归档器(如zip或rar )对其进行压缩,这些文件支持对归档中的单个文件进行随机访问。

票数 19
EN

Stack Overflow用户

发布于 2010-10-24 19:48:35

看一看dictzip。它与gzip兼容,允许粗随机访问。

摘录自其手册页:

命令压缩使用 gzip (1)算法(LZ77)以与gzip文件格式完全兼容的方式压缩文件。gzip文件格式的扩展名(在RFC 1952的2.3.1.1中描述的额外字段)允许将额外的数据存储在压缩文件的头中。像gzip和zcat这样的程序将忽略这些额外的数据。然而,将利用这些数据对文件执行伪随机访问.

我在Ubuntu里有这个软件包。或者它的源代码在.tar.gz中。它的许可证是GPL。你可以自由地学习它。

更新:

我改进了dictzip,使其没有文件大小限制。我的实施是受麻省理工学院许可的。

票数 35
EN

Stack Overflow用户

发布于 2014-05-03 11:53:47

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

随机存取读取:数据可以分割成独立的压缩块.每个.xz文件都包含块的索引,这使得当块大小足够小时有限的随机访问读取成为可能。

这对你来说应该足够了。一个缺点是liblzma的API (用于与这些容器交互)似乎没有那么好的文档,因此可能需要一些努力才能找到如何随机访问块。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/429987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档