Compression 允许在文件中进行随机读/写的最佳压缩算法是什么?

Compression 允许在文件中进行随机读/写的最佳压缩算法是什么?,compression,random-access,huffman-code,adaptive-compression,Compression,Random Access,Huffman Code,Adaptive Compression,允许在文件中进行随机读/写的最佳压缩算法是什么 我知道任何自适应压缩算法都是不可能的 我知道哈夫曼编码是不可能的 有没有人有更好的压缩算法来允许随机读写 我想如果你用块来写的话,你可以使用任何压缩算法,但理想情况下我不想一次解压一个完整的块。但是如果你有一个简单的方法来做这件事,以及如何知道区块边界的建议,请让我知道。如果这是您的解决方案的一部分,请让我知道当您要读取的数据跨越块边界时,您会怎么做 在你回答的上下文中,假设文件是100GB,有时我想读前10个字节,有时我想读最后19个字节,有时我

允许在文件中进行随机读/写的最佳压缩算法是什么

我知道任何自适应压缩算法都是不可能的

我知道哈夫曼编码是不可能的

有没有人有更好的压缩算法来允许随机读写

我想如果你用块来写的话,你可以使用任何压缩算法,但理想情况下我不想一次解压一个完整的块。但是如果你有一个简单的方法来做这件事,以及如何知道区块边界的建议,请让我知道。如果这是您的解决方案的一部分,请让我知道当您要读取的数据跨越块边界时,您会怎么做


在你回答的上下文中,假设文件是100GB,有时我想读前10个字节,有时我想读最后19个字节,有时我想在中间读取17个字节。p> 我不知道有哪种压缩算法允许随机读取,更不用说随机写入了。如果您需要这种能力,最好将文件压缩成块,而不是作为一个整体

e、 g.
我们将首先查看只读案例。假设您将文件分解为8K块。压缩每个块并按顺序存储每个压缩块。您需要记录每个压缩块的存储位置和大小。然后,假设您需要从偏移量O开始读取N个字节。您需要找出它在哪个块中(O/8K),解压缩该块并获取这些字节。您需要的数据可能跨越多个数据块,因此您必须处理该场景

当您希望能够写入压缩文件时,事情会变得复杂。您必须处理越来越大和越来越小的压缩块。您可能需要为每个块添加一些额外的填充,以防其扩展(未压缩的块大小仍然相同,但不同的数据将压缩到不同的大小)。如果压缩数据太大,无法放回原始空间,甚至可能需要移动块


这就是压缩文件系统的工作原理。您最好对文件启用文件系统压缩,然后正常地读/写它们。

压缩就是要消除数据中的冗余。不幸的是,冗余不太可能在整个文件中以单调的均匀性分布,而这大概是唯一可以预期压缩和细粒度随机访问的场景

但是,您可以通过维护一个在压缩过程中构建的外部列表来接近随机访问,该列表显示未压缩数据流中的选定点与其在压缩数据流中的位置之间的对应关系。显然,您必须选择一种方法,使源流与其压缩版本之间的转换方案不随流中的位置而变化(即,不使用LZ77或LZ78;相反,您可能希望使用哈夫曼或字节对编码)。显然,这会产生大量开销,您必须决定如何在“书签点”所需的存储空间和从书签点开始解压流以获取实际读取数据所需的处理器时间之间进行权衡

至于随机存取写入。。。那几乎是不可能的。如前所述,压缩是指从数据中删除冗余。如果您试图用不具有相同冗余的数据替换可能被压缩和被压缩的数据,那么它根本不适合


但是,根据您将要执行的随机访问写入量,您可以通过维护一个稀疏矩阵来模拟它,该矩阵表示压缩后写入文件的所有数据。在所有读取中,您都会检查矩阵,查看是否正在读取压缩后写入的区域。如果没有,那么您将转到压缩文件以获取数据。

基于字典的压缩方案,每个字典条目的代码都被编码为相同的大小,这将导致能够以代码大小的任意倍数开始读取,并且如果代码不使用其上下文/邻居,则写入和更新都很容易


如果编码包含区分代码的开始或结束的方式,那么您不需要代码长度相同,并且可以在文件中间的任何地方开始读取。如果你从流中的未知位置阅读,这项技术会更有用。

我认为斯蒂芬·丹尼可能在这里发现了一些东西。想象一下:

  • 序列到代码的类zip压缩
  • 字典映射代码->序列
  • 文件将类似于文件系统
    • 每次写入都会生成一个新的“文件”(字节序列,根据字典进行压缩)
    • “文件系统”跟踪哪个“文件”属于哪个字节(开始、结束)
    • 每个“文件”都根据字典进行压缩
    • 以文件方式读取工作,根据“文件系统”解压缩和检索字节
    • 写入使“文件”无效,新的“文件”被附加以替换无效的文件
  • 该系统将需要:
    • 文件系统的碎片整理机制
    • 不时压缩字典(删除未使用的代码)
  • 如果做得好,可以在没有人查看(空闲时间)时进行内务管理,或者创建一个新文件并最终进行“切换”
一个积极的影响是词典将适用于整个文件。如果可以节省CPU周期,则可以定期检查重叠“文件”边界的序列,然后重新组合它们

这个想法是为了真正的随机阅读。如果你只想