仅解压指定的bzip2块

11
假设我有一个bzip2文件(超过5GB),我只想解压缩第x个块,因为那里是我的数据(每次块都不同)。我该怎么做?
我考虑制作所有块的索引,然后从文件中剪切所需的块,并对其应用bzip2recover。
我也考虑到按1MB为单位压缩,然后将其附加到文件中(并记录位置),并在需要时直接抓取文件,但我宁愿保留原始的bzip2文件。
我的首选语言是Ruby,但任何语言的解决方案都可以(只要我理解原则)。
2个回答

7

这里有一个关于IT技术的相关链接: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

“BZh1”头部的位数为32,在经典bzip2中,“1”可以是从“1”到“9”的任何数字-这是以kb为单位的(未压缩)块大小(不准确)。


注意!块的起始位置可能不是字节边界:( "seek-bzip2"中包含了一个名为bzip-table的程序,用于获取原始数据块大小的位移和大小列表。 - osgx
不幸的是,“bzip-table” 的速度几乎与实际解压缩相同 :(. 它执行了几乎完整的解压缩循环,但没有检查 CRC。 - osgx
此外,还要看一下像Jeff Gilchrist的pbzip2这样的并行bzips。在并行解压缩中,需要搜索块头。代码:http://www.google.com/codesearch/p?hl=en#calSvFpbfuI/trunk/trunk/demo/pbzip2-1.0.2/pbzip2.cpp&q=pbzip2&sa=N&cd=2&ct=rc&l=3 producer_decompress函数。 - osgx

2

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

不过,我确实需要在Windows上编译时得到一些帮助。


http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20110316/mingw-get-inst-20110316.exe/download - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接