随机寻求7z压缩单个文件存档

问题描述 投票:2回答:4

是否有可能做的随机存取(很多寻求的)到非常巨大的文件,由7zip的压缩?

原始文件是非常巨大的(999 GB 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算法进行压缩。上测试减压速度(的解包数据)600 MB /秒,只有一个CPU核心被使用。

wikipedia 7zip compression random-access
4个回答
2
投票

这在技术上是可行的,但如果你的问题是“不当前可用的二进制7zip的命令行工具允许”,答案不幸的是没有。它允许最好是independantly每个文件压缩成归档,从而可以直接检索的文件但因为要压缩的是一个单一的(巨大)的文件,这一招是行不通的。

恐怕唯一的办法就是块文件成小块,并把它们喂到LZMA编码器(包含在LZMA SDK)。不幸的是,需要一些编程技巧。

注:技术上逊色,但琐碎的压缩算法,可以在这里找到。主程序做你正在寻找的地方:切源文件成小块,并给他们一个接一个的压缩机(在这种情况下,LZ4)。然后,解码器执行相反的操作。它可以轻松地跳过所有压缩块,直接进入你要检索的一个。 http://code.google.com/p/lz4/source/browse/trunk/lz4demo.c


1
投票

这个怎么样:

理念:因为你基本上是读只有一个文件,索引.7z压缩块。

读框的压缩文件块,得到每个块的数,并可能在大文件的偏移量。扫描用于数据流(例如,维基百科文章标题)中对象项目的锚。对于每一个锚记录保存在项目开始blocknumber(这是可能的块之前)

写索引某种O(log n)的商店。对于访问,检索blocknumber和偏移量,提取块,并找到该项目。成本势必于一个块(或极少数),并在该块的序列检索的提取。

为此,你必须通过文件一次阅读,但你可以流并处理后丢弃,所以没有打盘。

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


0
投票

7Z归档说,这个文件有单个数据块,用LZMA算法进行压缩。

什么是7Z / XZ命令来查找它是单一压缩块或没有?与多个线程使用时将7Z创建多块(多数据流)存档?

原始文件是非常巨大的(999 GB XML)

好消息:维基百科切换到多流存档其转储(至少enwiki):http://dumps.wikimedia.org/enwiki/

例如,最近的转储,http://dumps.wikimedia.org/enwiki/20140502/具有多数据流的bzip2(带独立指数“偏移: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

我认为,我们可以用bzip2的指数来估算文章编号甚至7Z堆放,然后我们只需要用正确的范围内,7Z压缩文件(..p first_id p last_id .7z压缩)。 stub-meta-history.xml可能帮助了。

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


0
投票

仅使用:

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

范例中得到7号线:

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

© www.soinside.com 2019 - 2024. All rights reserved.