4

是否可以对由 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 存档器说这个文件有一个数据块,用 LZMA 算法压缩。测试解压速度为 600 MB/s(解压数据),仅使用一个 CPU 内核。

4

4 回答 4

2

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

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

注意:可以在此处找到技术上较差但微不足道的压缩算法。主程序执行您正在寻找的工作:将源文件切成小块,并将它们一个一个地提供给压缩器(在本例中为 LZ4)。然后解码器执行相反的操作。它可以轻松跳过所有压缩块并直接转到您要检索的块。 http://code.google.com/p/lz4/source/browse/trunk/lz4demo.c

于 2011-10-25T12:10:25.850 回答
1

这个怎么样:

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

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

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

为此,您必须通读文件一次,但您可以流式传输并在处理后丢弃它,因此不会影响磁盘。

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

于 2011-10-25T16:09:19.787 回答
1

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

什么是 7z / xz 命令来查找它是否是单个压缩块?与多个线程一起使用时,7z 会创建多块(多流)存档吗?

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

好消息:wikipedia 转储为多流档案(至少对 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

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

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

于 2014-06-05T12:03:10.797 回答
1

仅使用:

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

示例获取第 7 行:

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

于 2019-02-03T08:46:24.047 回答