【问题标题】:Open-Source compression algorithm with Checkpoints [closed]带有检查点的开源压缩算法[关闭]
【发布时间】:2011-07-30 07:32:52
【问题描述】:

我正在使用 gcc 4.5.0 和 msvc8/9 使用 C++。

我希望能够压缩一个文件 (10 Gb),然后使用我的应用程序打开这个文件。

但是,文件内容是这样的,我每次使用它们时都不一定需要其中的所有内容。

因此,例如,有一次我打开这些压缩文件之一,并决定在不加载文件的情况下搜索 95% 的路径。使用 gzip 之类的压缩算法,这是不可能的:我必须先解压缩文件的前 95%,然后才能解压缩最后 5%。

So, are they any libraries similar to gzip, that are open source 
and available for commercial use, that have built in check points, 
to re-sync the decompression stream?

我认为也许无损音频编解码器可以解决问题。我知道其中一些算法具有检查点,因此您可以在音乐文件中查找,而不必等待音乐文件的全部内容被解压缩。使用音频编解码器进行数据解压缩是否存在缺陷?

谢谢!

【问题讨论】:

标签: c++ algorithm open-source compression gzip


【解决方案1】:
【解决方案2】:

bzip2 是免费和开源的,并且有现成的库实现。它是基于块的,所以你可以只解压缩你需要的部分。但是,如果您需要查找解压缩文件中的特定位置,您可能需要在所有 bzip2 块上建立一个简单的索引,以便确定哪个包含您需要的地址。

gzip 虽然是基于流的,但可以在任意块边界上重置。任意数量的 gzip 流的串联本身就是一个有效的 gzip 流,因此您可以轻松地在块压缩模式下操作 gzip,而不会破坏与现有解压缩器的兼容性。

【讨论】:

    【解决方案3】:

    一种简单的方法是将未压缩的内容切成“块”并独立压缩每个块。它们不会完全压缩(因为您不会在块之间“共享”),但您可以独立解压缩块。

    压缩视频中的“关键帧”是这种通用方法的一种特殊情况。

    【讨论】:

      【解决方案4】:

      我不确定开源,但已经/有相当多的程序可以做到这一点。如果输入是静态的,这很简单——选择一个固定的块大小,并在压缩那么多输入数据后重新启动压缩器。

      如果内容是动态的,事情会变得有点难看,因为当您更改输入块的内容时,通常会更改其大小。至少有两种方法可以解决这个问题:一种是在块之间插入少量填充,因此可以就地容纳小的变化(例如,从 64K 输入块开始的内容被四舍五入为整数512 字节压缩块)。第二个是创建一个索引以从压缩块映射到解压缩块。我很确定一个实用的解决方案通常会同时使用这两种方法。

      【讨论】:

        猜你喜欢
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        相关资源
        最近更新 更多