【问题标题】:Only decompress a specific bzip2 block只解压特定的 bzip2 块
【发布时间】:2010-12-02 14:38:55
【问题描述】:

假设我有一个 bzip2 文件(超过 5GB),我只想解压缩块 #x,因为我的数据在哪里(块每次都不同)。我该怎么做?

我想为所有块的位置建立一个索引,然后从文件中剪切我需要的块并对其应用 bzip2recover。

我还考虑过一次压缩 1MB,然后将其附加到文件中(并记录位置),并在需要时简单地抓取文件,但我宁愿保持原始 bzip2 文件完整。

我的首选语言是 Ruby,但任何语言的解决方案我都可以(只要我了解原理)。

【问题讨论】:

    标签: archive compression bzip2 bzip


    【解决方案1】:

    有一个http://bitbucket.org/james_taylor/seek-bzip2

    获取源代码,编译它。

    运行

    ./seek-bzip2  32 < bzip_compressed.bz2 
    

    测试。

    唯一的参数是奇怪块头的位位移。 您可以通过在二进制文件中找到“31 41 59 26 53 59”十六进制字符串来获取它。这是不正确的。块开始可能未与字节边界对齐,因此您应该搜索“31 41 59 26 53 59”十六进制字符串的每个可能的位移,就像在 bzip2recover 中所做的那样 - http://www.bzip.org/1.0.3/html/recovering.html

    32 是“BZh1”标头的位大小,其中 1 可以是从“1”到“9”的任何数字(在经典 bzip2 中) - 它是数百 kb 的(未压缩)块大小(不精确)。

    【讨论】:

    • 原文如此!块开始不能是字节边界:(“seek-bzip2”中包含一个bzip-table程序来获取位位移列表和原始数据块大小的大小。
    • 不幸的是,“bzip-table”与实际解压缩的速度几乎相同:(。它几乎完成了完整的解压缩周期,但不检查 CRC。
    • 另外,看看并行 bzip,比如 Jeff Gilchrist 的 pbzip2。在并行解压缩中,它需要搜索一个块头。代码:google.com/codesearch/p?hl=en#calSvFpbfuI/trunk/trunk/demo/…producer_decompress函数
    【解决方案2】:

    确实,bzip-table 几乎与解压缩一样慢,但当然您只需执行一次,您可以以某种方式存储输出以用作索引。这非常适合我的需要,但可能不是每个人都需要的。

    不过,我确实需要一点帮助才能让它在 Windows 上编译。

    猜你喜欢
    • 2011-01-20
    • 2011-10-29
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多