只解压缩一个特定的bzip2块
问题描述:
假设我有一个bzip2文件(超过5GB),并且我只想解压缩块#x,因为我的数据在哪里(块每次都不一样)。我将如何做到这一点?只解压缩一个特定的bzip2块
我想过要制作所有块的位置索引,然后从文件中剪切出我需要的块并将bzip2recover应用到它。我还考虑过一次压缩1MB,然后将其附加到一个文件(并记录位置),并在需要时抓取该文件,但我宁愿保持原始bzip2文件不变。
我的首选语言是Ruby,但任何语言的解决方案对我来说都很好(只要我明白原则)。
答
有一个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中) - 它是一个(未压缩的)数据块大小(不是精确的)。
答
确实,bzip表的速度几乎和解压缩一样慢,但是当然你只需要做一次,你就可以以某种方式存储输出以用作索引。这对我所需要的是完美的,但可能不是每个人都需要的。
我确实需要一点帮助才能在Windows上编译它。
sic!块开始可以不是一个字节边界:(有一个bzip表程序包含在“seek-bzip2”中以获得位移位和原始数据块大小的列表。 – osgx 2010-09-13 16:35:03
不幸的是,“bzip-table”几乎相同速度作为实际的解压缩:(。它做几乎完整的解压缩周期,但不检查CRC。 – osgx 2010-09-14 15:06:01
此外,请看看并行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