常用的随机访问压缩?

Random-access compression in common use?

是否有用于随机访问压缩、只读或读写的标准库或 unix 工具?通过随机访问,我的意思是您可以读取或写入压缩内容的任何部分。

有很多流媒体工具(gzip、xz 等)和一些基于存档成员的工具 (zip),但我只知道一般关于随机访问的学术工作。存档的主要问题是它们通常单独压缩每个文件(没有跨文件的重复数据删除)。

Compression formats with good support for random access within archives? 有点相关,但因为是 10 年后才重新提问。

对于问题的“读取”部分,您可以为一个大型压缩文件建立索引,该文件创建一组进入压缩数据的入口点。这些入口点的数量和密度决定了在找到所需内容之前需要解压缩的数据量,从而决定了随机访问的速度。请注意,可以随机访问 all 压缩数据,因为您总是在开始时有一个入口点。您只需减压,直到得到您想要的。那么随机读取就不是能力的问题了,而是速度的问题。

zran.c provides an example of building such an index for a gzip or zlib stream. You could do this for any compressed data format. Also pigz will create a gzip stream with marked entry points using the --independent option. The bzip2 format 已经为每个块标记了入口点,其中入口是相隔几百 K 字节的未压缩数据。

至于“或写”,那是完全不同的问题。我不知道有一种格式可以促进随机写入压缩数据。通常,要获得任何级别的适当压缩,压缩数据取决于它之前的所有数据。所以如果你写在中间,你需要解压和重新压缩后面的所有数据。

要获得真正的随机写入访问权限,格式必须解决两个问题。第一种是对压缩数据进行分块,就像 bzip2 或 pigz 的独立选项所做的那样,以打破对先前数据的依赖。如果您不经常这样做,那么对压缩率的影响只会很小。然后你可以拿一个块,解压它,做你的随机写入,然后重新压缩它。块越小,这种随机写入访问的速度就越快,但您必须权衡较小块的压缩率影响。

第二个要解决的问题与文件系统存在的问题相同,即允许碎片化和非顺序排列。您希望避免由于新随机写入的块变小或变大而不得不重写压缩数据中的所有后续块。如果您确实进行了重写,您将回到随机写入,所花费的时间与压缩流的大小成正比。解决方案是编写您自己的内置于压缩数据格式中的小文件系统,允许数据块在流中不按顺序排列,并且在流中存在未使用的间隙。我知道没有任何格式可以执行此操作,但原则上可以实现。

如果您将写入权限限制为附加,例如压缩日志的情况,则有针对现有格式的解决方案。 gzlog 是附加到 gzip 流的示例,允许高效地附加少量数据,在每次附加后留下有效的 gzip 流。