下载大型 Gzip 文件并解压缩时出现内存错误
Memory error while downloading large Gzip files and decompressing them
我正在尝试从 https://datasets.imdbws.com/title.principals.tsv.gz 下载数据集,在我的代码本身中解压缩内容 (Python) 并将生成的文件写入磁盘。
为此,我使用了以下代码片段。
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 文件直接下载到磁盘上并解压缩以获取实际数据。
您可以使用 streaming 请求和 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()
此代码段逐块读取数据并将其馈送到可以处理数据流的 zlib。
根据您的连接速度和 CPU/disk 性能,您可以测试各种块大小。
我正在尝试从 https://datasets.imdbws.com/title.principals.tsv.gz 下载数据集,在我的代码本身中解压缩内容 (Python) 并将生成的文件写入磁盘。
为此,我使用了以下代码片段。
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 文件直接下载到磁盘上并解压缩以获取实际数据。
您可以使用 streaming 请求和 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()
此代码段逐块读取数据并将其馈送到可以处理数据流的 zlib。
根据您的连接速度和 CPU/disk 性能,您可以测试各种块大小。