在7z单文件存档中随机查找



是否可以随机访问(大量查找)到非常大的文件,由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

UPDATE: 7z归档器说这个文件只有一个数据块,用LZMA算法压缩。测试解压缩速度为600mb/s(解压缩数据),只使用一个CPU核心

这在技术上是可能的,但如果您的问题是"当前可用的二进制7zip命令行工具是否允许",那么很不幸,答案是不允许。它允许的最好的情况是将每个文件独立地压缩到存档中,从而允许直接检索文件。但是由于要压缩的是单个(大)文件,因此此技巧将不起作用。

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

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

这个怎么样:

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

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

将索引写入某种O(log n)存储。对于访问,检索块号及其偏移量,提取块并找到项目。代价是提取一个(或很少的)块,并在该块中搜索字符串。

对于这种情况,您必须读取一次文件,但是您可以流式传输它并在处理后丢弃它,因此没有任何内容到达磁盘。

该死的:你基本上在你的问题中假设了这一点…

7z归档器说这个文件只有一个数据块,用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转储存储在许多sub-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

我认为,我们可以使用bzip2索引来估计文章id,即使是7z转储,然后我们只需要7z归档与正确的范围(..)P first_id P last_id .7z)。stub-meta-history.xml可能也有帮助。

FAQ for dumps:http://meta.wikimedia.org/wiki/Data_dumps/FAQ

只能使用:

7z e myfile_xml.7z -so | sed [something] 
获取第7行:

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

最新更新