这和一个之前的问题类似,但是那里的答案并不能满足我的需求,而且我的问题略有不同:
我目前针对一些非常大的包含排序数据的文件使用gzip压缩。当这些文件未经压缩时,二分查找是一种方便有效的支持随机访问到排序数据位置的方式。
但是当文件进行压缩后,情况就变得棘手了。我最近发现了zlib的Z_FULL_FLUSH
选项,可以在压缩过程中插入“同步点”到压缩输出中(inflateSync()
然后可以从文件中的各个点开始读取)。这还好,尽管已经存在的文件需要重新压缩才能添加此功能(奇怪的是,gzip
没有这个选项,但如果必须,我愿意编写自己的压缩程序)。
从一个消息来源来看,即使Z_FULL_FLUSH
也不是完美的解决方案...不仅它不受所有gzip存档的支持,而且在档案中检测同步点的想法可能会产生误报(由于与同步点的幻数巧合或者由于Z_SYNC_FLUSH
也会产生同步点但不能用于随机访问)。
有更好的解决方案吗?如果可能,我想避免使用索引辅助文件,并且显式、默认地支持准随机访问将会很有帮助(即使是粗粒度的——比如能够在每10MB间隔处开始读取)。是否有其他压缩格式比gzip更好地支持随机读取?
编辑:如我所述,我希望在压缩数据中进行二分查找。我不需要定位到特定的(未压缩的)位置——只需要在压缩文件中以一些粗略的粒度进行搜索。我只需要支持类似于“从这个压缩文件的大约50%(25%、12.5%等)处开始解压数据”的功能。