【问题标题】:Memory error while downloading large Gzip files and decompressing them下载大型 Gzip 文件并解压缩时出现内存错误
【发布时间】:2020-03-25 15:54:44
【问题描述】:

我正在尝试从https://datasets.imdbws.com/title.principals.tsv.gz 下载数据集,解压缩代码本身(Python)中的内容并将生成的文件写入磁盘。

为此,我使用以下代码 sn-p。

results = requests.get(config[sourceFiles]['url'])
    with open(config[sourceFiles]['downloadLocation']+config[sourceFiles]['downloadFileName'], 'wb') as f_out:
        print(config[sourceFiles]['downloadFileName'] + " starting download")
        f_out.write(gzip.decompress(results.content))
        print(config[sourceFiles]['downloadFileName']+" downloaded successfully")

此代码适用于大多数 zip 文件,但对于较大的文件,它会给出以下错误消息。

File "C:\Users\****\AppData\Local\Programs\Python\Python37-32\lib\gzip.py", line 532, in decompress
    return f.read()
  File "C:\Users\****\AppData\Local\Programs\Python\Python37-32\lib\gzip.py", line 276, in read
    return self._buffer.read(size)
  File "C:\Users\****\AppData\Local\Programs\Python\Python37-32\lib\gzip.py", line 471, in read
    uncompress = self._decompressor.decompress(buf, size)
MemoryError

有没有一种方法可以做到这一点,而无需将 zip 文件直接下载到磁盘上并解压缩以获取实际数据。

【问题讨论】:

  • gzip 压缩与 zip 存档不同。

标签: python gzip


【解决方案1】:

您可以使用流媒体请求加上zlib

import zlib
import requests

url = 'https://datasets.imdbws.com/title.principals.tsv.gz'
result = requests.get(url, stream=True)
f_out = open("result.txt", "wb")
chunk_size = 1024 * 1024

d = zlib.decompressobj(zlib.MAX_WBITS|32)

for chunk in result.iter_content(chunk_size):
    buffer = d.decompress(chunk)
    f_out.write(buffer)

buffer = d.flush()
f_out.write(buffer)

f_out.close()

这个 sn-p 逐块读取数据并将其提供给可以处理数据流的 zlib。
根据您的连接速度和 CPU/磁盘性能,您可以测试各种块大小。

【讨论】:

  • 您可以使用流式代码吗?在我的测试中,内存使用量没有超过 45 MB。
  • 感谢您的回答。这似乎工作正常。我尝试使用 gzip 包解压缩应用流/块逻辑,但最终抛出 EOFError: Compressed file 在到达流结束标记之前结束。猜猜神奇在于 zlib 如何处理解压缩。 link
  • 是的,gzip 模块就是这样设计的。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多