【问题标题】:Most memory efficient way to save binary file from the web with Python 2.6?使用 Python 2.6 从 Web 保存二进制文件的最节省内存的方法?
【发布时间】:2009-05-17 16:56:17
【问题描述】:

我正在尝试使用 Python 2.6 和 urllib 从 Web 下载(并保存)一个二进制文件。

据我了解,read()、readline() 和 readlines() 是读取类文件对象的 3 种方法。 由于二进制文件并没有真正分成换行符,因此 read() 和 readlines() 将整个文件读入内存。

选择随机的 read() 缓冲区大小是在此过程中限制内存使用的最有效方法吗?

import urllib
import os

title = 'MyFile'
downloadurl = 'http://somedomain.com/myfile.avi'
webFile = urllib.urlopen(downloadurl)
mydirpath = os.path.join('c:', os.sep,'mydirectory',\
                         downloadurl.split('/')[-1])

if not os.path.exists(mydirpath):
    print "Downloading...%s" % title
    localFile = open(mydirpath, 'wb')
    data = webFile.read(1000000) #1MB at a time
    while data:
        localFile.write(data)
        data = webFile.read(1000000) #1MB at a time
    webFile.close()
    localFile.close()
    print "Finished downloading: %s" % title
else:
    print "%s already exists." % mydirypath

我随意选择了 read(1000000),因为它可以工作并降低 RAM 使用率。我假设如果我使用的是原始网络缓冲区,则选择随机数量会很糟糕,因为如果传输速率太低,缓冲区可能会干涸。但似乎 urllib 已经在为我处理较低级别的缓冲了。

考虑到这一点,选择任意数字可以吗?有没有更好的办法?

谢谢。

【问题讨论】:

    标签: buffer binaryfiles urllib python-2.6


    【解决方案1】:

    您应该为此使用urllib.urlretrieve。它会为你处理一切。

    【讨论】:

      【解决方案2】:

      您应该查看shutil 模块,而不是使用您自己的读写循环。 copyfileobj 方法将让您定义缓冲。最有效的方法因情况而异。即使将相同的源文件复制到相同的目的地,也可能因网络问题而有所不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-30
        • 2011-10-03
        • 2023-02-26
        • 2014-01-07
        相关资源
        最近更新 更多