错误: self._content = bytes()。join(self.iter_content(CONTENT_CHUNK_SIZE))或bytes() 的MemoryError
def download(self):
print("start thread:%s at %s" % (self.getName(), time.time()))
headers = {"Range": "bytes=%s-%s" % (self.startpos, self.endpos)}
res = requests.get(self.url, headers=headers, stream=True)
# res.text 是将get获取的byte类型数据自动编码,是str类型, res.content是原始的byte类型数据
# 所以下面是直接write(res.content)
with open(self.filename, "wb") as fp:
fp.seek(self.startpos)
fp.write(res.content)
print("stop thread:%s at %s" % (self.getName(), time.time()))
# f.close()
def run(self):
self.download()
答案 0 :(得分:1)
我在Windows 10上遇到了同样的问题。如果您的平台不是Windows NT或更新版本,那么这个答案将无济于事。
问题是:在Windows上,套接字输入始终是缓冲的。这是无法避免的。没门。这导致MemoryError因为Windows(不是Python代码)和Python C内部 - 套接字输入被缓冲到C变量,这些变量有限,所以我们必须帮助"缓冲区 - 解决方案是:创建一个bytearray
对象,在while循环中调用它的join方法(第二个参数--sockobj.recv(1024))。要完成此操作,请导航到<Python Installdir>\Lib\requests.py
(也可以是Lib\site-packages\requests\__init__.py
- 注意两个下划线!)并使用上面指定的修复程序修复所有套接字使用情况。同时对requests
包和urllib3
包中的所有文件执行此类修复。
希望这有帮助。
没有。 Python 64bit不会解决您的问题:Windows Socket Buffer将保持同样的状态!只有使用显式Python recv
缓冲区的循环bytearray
才有帮助!
答案 1 :(得分:0)
您正在使用stream=True
,其中显式使用缓冲数据,因此您可以异步清空缓冲区。
你不这样做。因此,请不要使用stream=True
,而是直接保存到文件中。