我在一个7z存档中有一个100 GB的文本文件。我可以通过1MB块读取模式'hello' (7z将数据输出到stdout):
Popen("7z e -so archive.7z big100gb_file.txt", stdout=PIPE)
while True:
block = proc.stdout.read(1024*1024) # 1 MB block
i += 1
...
if b'hello' in block: # omitting other details for search pattern split in consecutive blocks...
print('pattern found in block %i' % i)
...现在我们已经在搜索5分钟后发现模式'hello'是,比方说在23456块中,将来如何在7z文件中非常快地访问这个块或行?
(如果可能的话,不要将这些数据保存在另一个文件/索引中)
使用7z**,的如何在文件中间查找?**
注意:我已经读过索引/随机访问7zip .7z档案和7z单文件档案中的随机查找了,但是这些问题并没有讨论具体的实现。
发布于 2022-05-10 16:20:35
原则上,建立压缩数据索引是可能的。您可以选择一个块大小的未压缩数据,其中每个块的开始将是一个入口点,在那里您将能够开始解压缩。索引将是要构建的单独文件或内存中的大型结构,并为每个入口点保存整个解压缩状态。您需要对所有压缩的数据进行一次解压缩才能生成索引。块大小的选择将是您希望访问压缩数据中的任何给定字节的速度与索引大小之间的平衡。
7z可以使用几种不同的压缩方法(平减、lzma2、bzip2、ppmd)。对于每种方法,实现这种随机访问所需做的事情都是完全不同的。
另外,对于每种方法,有更好的地方来选择入口点,而不是一些固定的未压缩块大小。这样的选择将大大减少索引的大小,同时利用该方法使用的压缩数据的内部结构。
例如,bzip2具有在每个bzip2块上没有历史记录的自然入口点,默认情况下,每个入口点都有900个未压缩数据。这使得索引非常小,只需要保存压缩和未压缩的偏移量。
对于平减,入口点可以是放气块,其中索引是选定的平减块的压缩和未压缩偏移量,以及每个入口点的32K字典。zran.c实现了这样一个索引,用于压缩压缩数据。
lzma2或ppmd压缩流中任何一点的解压缩状态都是非常大的。我不相信这种随机存取方法对这些压缩方法是可行的。压缩后的数据格式需要修改,以便在压缩时将其分解为块,代价是压缩比。
https://stackoverflow.com/questions/72150369
复制相似问题