2009-09-30 70 views
9

假设我有一个bzip2文件(超过5GB),并且我只想解压缩块#x,因为我的数据在哪里(块每次都不一样)。我将如何做到这一点?只解压缩一个特定的bzip2块

我想过要制作所有块的位置索引,然后从文件中剪切出我需要的块并将bzip2recover应用到它。我还考虑过一次压缩1MB,然后将其附加到一个文件(并记录位置),并在需要时抓取该文件,但我宁愿保持原始bzip2文件不变。

我的首选语言是Ruby,但任何语言的解决方案对我来说都很好(只要我明白原则)。

回答

6

有一个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中) - 它是一个(未压缩的)数据块大小(不是精确的)。

+0

sic!块开始可以不是一个字节边界:(有一个bzip表程序包含在“seek-bzip2”中以获得位移位和原始数据块大小的列表。 – osgx 2010-09-13 16:35:03

+0

不幸的是,“bzip-table”几乎相同速度作为实际的解压缩:(。它做几乎完整的解压缩周期,但不检查CRC。 – osgx 2010-09-14 15:06:01

+0

此外,请看看并行bzip,如杰夫吉尔克里斯特pbzip2。在并行解压缩它需要搜索块标题。代码: http://www.google.com/codesearch/p?hl=zh_CN#calSvFpbfuI/trunk/trunk/demo/pbzip2-1.0.2/pbzip2.cpp&q=pbzip2&sa=N&cd=2&ct=rc&l=3'producer_decompress'功能 – osgx 2010-09-14 21:15:00

2

确实,bzip表的速度几乎和解压缩一样慢,但是当然你只需要做一次,你就可以以某种方式存储输出以用作索引。这对我所需要的是完美的,但可能不是每个人都需要的。

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

+0

用msys试试mingw – osgx 2010-12-15 17:13:13

+0

http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20110316/mingw-get-inst-20110316.exe/download – osgx 2011-03-30 01:07:54