随机搜索7z单文件存档

时间:2011-10-24 21:41:29

标签: wikipedia 7zip compression random-access

是否可以对7zip压缩的非常大的文件进行随机访问(大量搜索)?

原始文件非常庞大(999gb xml),我无法以解压缩格式存储(我没有那么多可用空间)。因此,如果7z格式允许访问中间块而不在所选块之前解压缩所有块,我可以构建块开始的索引和相应的原始文件偏移。

我的7z档案的标题是

37 7A BC AF 27 1C 00 02 28 99 F1 9D 4A 46 D7 EA  // 7z archive version 2;crc; n.hfr offset
00 00 00 00 44 00 00 00 00 00 00 00 F4 56 CF 92  // n.hdr offset; n.hdr size=44. crc
00 1E 1B 48 A6 5B 0A 5A 5D DF 57 D8 58 1E E1 5F
71 BB C0 2D BD BF 5A 7C A2 B1 C7 AA B8 D0 F5 26
FD 09 33 6C 05 1E DF 71 C6 C5 BD C0 04 3A B6 29

更新:7z archiver说这个文件有一个数据块,用LZMA算法压缩。测试时的解压缩速度为600 MB / s(解压缩数据),仅使用一个CPU核心。

4 个答案:

答案 0 :(得分:2)

技术上可行,但如果您的问题是“当前可用的二进制7zip命令行工具是否允许”,那么答案很遗憾。 它允许的最好的方法是将每个文件独立压缩到存档中,允许直接检索文件。 但是,由于你想压缩的是一个(巨大的)文件,这个技巧将不起作用。

我担心唯一的方法是将文件分块为小块,并将它们提供给LZMA编码器(包含在LZMA SDK中)。不幸的是,这需要一些编程技巧。

注意:这里可以找到技术上较差但很简单的压缩算法。 主程序正是您正在寻找的:将源文件切割成小块,然后将它们逐个送入压缩器(在本例中为LZ4)。然后解码器执行相反的操作。它可以轻松跳过所有压缩块并直接转到要检索的块。 http://code.google.com/p/lz4/source/browse/trunk/lz4demo.c

答案 1 :(得分:1)

这个怎么样:

概念:因为你基本上只阅读一个文件,所以按块索引.7z。

逐块读取压缩文件,为每个块提供一个数字,可能还有一个大文件中的偏移量。扫描数据流中的目标项目锚(例如,维基百科文章标题)。对于每个锚记录,保存项目开始的块号(可能在之前的块中)

将索引写入某种O(log n)存储区。对于访问,检索块编号及其偏移量,提取块并找到该项。成本必然是提取一个块(或非常少)和该块中的字符串搜索。

为此你必须读完文件一次,但是你可以在处理之后对其进行流式传输并将其丢弃,因此没有任何内容可以访问磁盘。

DARN:你基本上在你的问题中假定这一点......在回答之前阅读这个问题似乎是有利的......

答案 2 :(得分:0)

  

7z archiver说这个文件有一个数据块,用LZMA算法压缩。

要找到的7z / xz命令是单个压缩块还是没有?当与多个线程一起使用时,7z会创建多块(多流)存档吗?

  

原始文件非常庞大(999gb xml)

好消息:维基百科转换为多流式存档以进行转储(至少对于enwiki):http://dumps.wikimedia.org/enwiki/

例如,最近的转储http://dumps.wikimedia.org/enwiki/20140502/具有多流bzip2(具有单独的索引" offset:export_article_id:article_name"),并且7z转储存储在许多子GB存档中〜每个档案3k(?)篇:

  

多个bz2流中的文章,模板,媒体/文件描述和主要元页面,每个流100个页面

enwiki-20140502-pages-articles-multistream.xml.bz2 10.8 GB
enwiki-20140502-pages-articles-multistream-index.txt.bz2 150.3 MB
     

所有具有完整编辑历史记录(.7z)的页面

enwiki-20140502-pages-meta-history1.xml-p000000010p000003263.7z 213.3 MB
enwiki-20140502-pages-meta-history1.xml-p000003264p000005405.7z 194.5 MB
enwiki-20140502-pages-meta-history1.xml-p000005406p000008209.7z 216.1 MB
enwiki-20140502-pages-meta-history1.xml-p000008210p000010000.7z 158.3 MB
enwiki-20140502-pages-meta-history2.xml-p000010001p000012717.7z 211.7 MB
 .....
enwiki-20140502-pages-meta-history27.xml-p041211418p042648840.7z 808.6 MB

我认为,即使对于7z转储我们也可以使用bzip2索引来估计文章ID,然后我们只需要具有正确范围的7z存档(..p first_id p last_id < / em> .7z)。 stub-meta-history.xml也可以提供帮助。

转储常见问题解答: http://meta.wikimedia.org/wiki/Data_dumps/FAQ

答案 3 :(得分:0)

仅用于:

7z e myfile_xml.7z -so | sed [something] 

示例获取第7行:

7z e myfile_xml.7z -so | sed -n 7p