【问题标题】:Behavior of Python 2.7's ZipFile when zipping files压缩文件时 Python 2.7 的 ZipFile 的行为
【发布时间】:2017-03-28 04:15:01
【问题描述】:

我目前正在使用 python 2.7 的 ZipFile。我在压缩多个文件以发送给用户时遇到了内存问题。

当我有代码时:

fp = open('myzip.zip', 'w')
archive = zipfile.ZipFile(fp, 'w', zipfile.ZIP_DEFLATED)
for filepath in filepaths:
   archive.write(filepath)
archive.close()

Python 是否会在某个时候将所有这些文件加载​​到内存中?我本来希望 Python 将文件的内容流式传输到 zip 中,但我不确定情况是否如此。

【问题讨论】:

  • 看起来模块一次将 8 * 1024 个字符读入内存 hg.python.org/cpython/file/2.7/Lib/zipfile.py#l1179
  • ZipFile.write() 不会消耗太多内存。如前所述,它使用适度的块大小,并在使用时释放它们。程序本身是在变大还是内存问题是别的意思?操作系统缓存写入,因此在操作系统开始提交数据之前它会很快。然后事情可能会陷入困境。
  • 有趣,好吧,这可能是一个红鲱鱼

标签: python python-2.7 zip


【解决方案1】:

This question/answer(均由同一用户提供)表明这一切都在内存中完成。他们提供了一个修改后的库 EnhancedZipFile 的链接,听起来它可以按您的意愿工作,但它似乎在该项目上没有太多活动。

如果你不是特别依赖 zip,那么this answer 暗示 bzip 库可以处理大文件。

【讨论】:

  • 那个作者使用writestr是因为他想修改写入文件的名称。该方法需要将整个文件读入内存,但此处使用的方法不需要。从 python 3.6 开始,ZipFile.open 支持写入模式......所以这个问题终于修复了!
【解决方案2】:

Python 会将您迭代的所有文件保存在内存中,除了调用将在操作系统上为您完成这项工作的可执行文件之外,我无法想到绕过它。

【讨论】:

  • 查看ZipFile.write 的文档。这些只是文件名,而不是文件内容。 OP 正在迭代一个现有的列表......那里没有明显的影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多