0

这是我的用例:

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

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

注意:这是针对 Java 项目的,因此我仅限于具有 Java 库的格式。

4

2 回答 2

2

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

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

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

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

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

于 2013-02-19T19:18:21.327 回答
0

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

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

[sharedcompression table]...

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

最后 shuffle/share 压缩表部分。

对 7zip、bzip 和其他软件是否会有所帮助是个问题。

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

于 2013-02-19T18:22:33.633 回答