1

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はすでに低レベルのバッファリングを処理しているようです。

それを念頭に置いて、任意の数を選択しても問題ありませんか?もっと良い方法はありますか?

ありがとう。

4

2 に答える 2

2

これに使用する必要がありますurllib.urlretrieve。それはあなたのためにすべてを処理します。

于 2009-05-17T17:05:56.630 に答える
1

独自の読み書きループを使用する代わりに、おそらくshutilモジュールをチェックアウトする必要があります。このcopyfileobjメソッドを使用すると、バッファリングを定義できます。最も効果的な方法は、状況によって異なります。同じソース ファイルを同じコピー先にコピーしても、ネットワークの問題によって異なる場合があります。

于 2009-05-17T17:08:33.633 に答える