Python3.6下载1.3G大视频文件生成MemoryError

时间:2017-11-02 06:05:16

标签: python

错误: 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()

2 个答案:

答案 0 :(得分:1)

我在Windows 10上遇到了同样的问题。如果您的平台不是Windows NT或更新版本,那么这个答案将无济于事。

问题是:在Windows上,套接字输入始终是缓冲的。这是无法避免的。没门。这导致MemoryError因为Windows(不是Python代码)和Python C内部 - 套接字输入被缓冲到C变量,这些变量有限,所以我们必须帮助&#34;缓冲区 - 解决方案是:创建一个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,而是直接保存到文件中。