memoryError:内存不足

时间:2017-07-26 06:12:43

标签: python

我写了一个程序,下载应用程序,电影和其他。但是当我运行它时,给我这个错误:

Traceback (most recent call last):
  File "tidopy.py", line 27, in <module>
data=urllib2.urlopen(addresslist[x]).read()
  File "C:\Python27\lib\socket.py", line 362, in read
  buf.write(data)
MemoryError: out of memory

我认为错误与此代码有关:

data=urllib2.urlopen(addresslist[x]).read()
file=open(namelist[x],'wb')
file.write(data)

数据是一个下载电影和其他

数据的变量

文件生成文件

和file.write(data)将数据放入文件

tidopy是我的程序名称..

我该如何解决?

帮助。

1 个答案:

答案 0 :(得分:4)

您似乎正在从网址下载文件并将其写入文件,但在此期间您希望data保存整个文件,这会在计算机的内存(页面文件的RAM)中运行当文件很大时(比如电影)。

解决方案是在下载文件时编写每个文件块,而不是将整个文件加载到内存中,然后再编写它。如果您想使用它,我会有一个小代码:

import requests # just a choice of comfort for me
def download(url_address, filename):
    response = requests.get(url_address, stream=True)
    response.raise_for_status()
    with open(filename, "wb") as f:
        total_length = response.headers.get('content-length')
        if total_length is None:
            f.write(response.content)
        else:
            total_length = int(total_length)
            for data in response.iter_content(chunk_size = total_length / 100):
                f.write(data)

如果您注意到,我已设置chunk_size = total_length / 100,这意味着每次data中的下载达到1%时,它都会写入该文件,然后将其替换为下一个1%的数据进来,所以它总是需要1%的数据存储在内存中。如果您下载的文件太大而无法处理内存中的1%,则应将chunk_size替换为固定的字节数,可能为1,000,000(大约为1 MB)