是否有任何存档格式支持许多小条目的有效压缩和直接访问单个条目?

时间:2013-02-19 18:01:33

标签: java compression zip

这是我的用例:

  • 我想将大约1K的许多小条目存储到大约8M的存档文件中。
  • 我希望能够有效地阅读单个条目(不读取整个文件)。
  • 我希望能够有效地压缩存档。在我执行的测试中,TAR + ZIP存档比ZIP存档小4倍。这并不奇怪,压缩个别1K条目的机会并不多。
  • 我不需要更新存档。一旦创建,它就是不可变的。

是否有支持(全局压缩+个人访问)的归档格式?从理论上讲,这两个目标并不相互排斥。

注意:这是针对Java项目的,因此我被限制为也具有Java库的格式。

2 个答案:

答案 0 :(得分:2)

我不知道您的问题的固定解决方案,因此您可能需要自己编写。

当然可以做到。我会使用tar格式,因为它很简单且易于理解,但它需要一个带有索引信息的辅助文件到压缩档案中。您要做的是控制tar文件的压缩以创建不需要历史记录的入口点。这些入口点需要比1K远得多,以实现良好的压缩,但它们可以足够接近,以提供对1K文件的相对快速的随机访问。

最简单的方法是使用gzip分别压缩tar文件的块,这些块表示一组大约128K字节的完整文件集。 gzip流可以简单地连接起来,生成的.tar.gz文件可以正常使用tar实用程序。它是gzip格式的一个属性,有效的gzip流连接也是有效的gzip流。

辅助文件将包含tar存档中的文件列表,它们在未压缩的tar文件中的大小和偏移量,然后分别包含每个gzip流起始点的压缩和未压缩偏移量。然后在提取文件时,您将在未压缩的tar文件中查找其偏移量,找到最大未压缩偏移量小于或等于该文件偏移量的gzip流,然后从相应的压缩偏移量开始解压缩,直到找到该文件

对于此示例,平均而言,您只需要解压缩64K即可获取存档中的任何给定文件。

答案 1 :(得分:0)

通常,构建的压缩表中散布着引用它的压缩数据。

如果有人想自己做压缩,一种方法是:

[sharedcompression table]...

[compression table addition specific to file 1] [file 1]
 ,,          ,,             ,,       ,, ,,   2   ,,   2
...

最后shuffle / share压缩表部分。

对于7zip,bzip和其他人来说,是否会获得这个问题。

BTW java zip处理(仍然?)不使用文件末尾的可选文件索引。