#!/usr/bin/python
import sys
import zlib
f = open(sys.argv[1], "rb")
z = zlib.decompressobj(15+16)
total = 0
while True:
buf = z.unconsumed_tail
if buf == "":
buf = f.read(1024)
if buf == "":
break
got = z.decompress(buf, 4096)
if got == "":
break
total += len(got)
print total
if z.unused_data != "" or f.read(1024) != "":
print "warning: more input after end of gzip stream"
可以使用^{} module 限制进程及其子进程的可用资源。在
如果需要在内存中解压缩,则可以设置
resource.RLIMIT_AS
(或RLIMIT_DATA
,RLIMIT_STACK
),例如使用上下文管理器将其自动还原为以前的值:如果达到限制;
MemoryError
将被提升。在如果您是为linux开发的,那么可以在单独的进程中运行解压,并使用ulimit来限制内存使用。在
记住减压_脚本.py在写入磁盘之前,应将整个文件解压缩到内存中。在
这将确定gzip流的未压缩大小,同时使用有限的内存:
提取时,它将返回中tar文件中所有文件所需空间的略微高估。长度包括这些文件以及tar目录信息。在
在gzip.py代码不控制解压的数据量,除非根据输入数据的大小。在gzip.py,它一次读取1024个压缩字节。所以你可以用gzip.py如果您可以为未压缩的数据使用最多1056768字节的内存(1032*1024,其中1032:1是deflate的最大压缩比)。这里的解决方案将
zlib.decompress
与第二个参数一起使用,这限制了未压缩数据的数量。gzip.py没有。在这将通过解码tar格式准确地确定提取的tar条目的总大小:
^{pr2}$你可以用它的变体来扫描tar文件中的炸弹。这样做的好处是,在您甚至还没有解压缩数据之前,就可以在头信息中找到一个大的大小。在
至于。焦油bz2归档文件中,pythonbz2库(至少在3.3版本中)对于bz2炸弹消耗太多内存来说不可避免地是不安全的。
bz2.decompress
函数不像zlib.decompress
那样提供第二个参数。由于运行长度编码,bz2格式的最大压缩比比zlib高得多,这使得情况变得更糟。bzip2将1gb的零压缩到722字节。因此,即使没有第二个参数,也不能像使用zlib.decompress
那样,通过测量输入来测量bz2.decompress
的输出。对解压输出大小没有限制是Python接口的一个基本缺陷。在我查看了3.3中的bz2module.c,看看是否有一种没有文档记录的方法来使用它来避免这个问题。没有办法绕过它。其中的
decompress
函数只是不断增加结果缓冲区,直到它可以解压缩所有提供的输入。_bz2module.c需要修复。在相关问题 更多 >
编程相关推荐