2009-05-17 8 views
1

Python 2.6 및 urllib를 사용하여 웹에서 이진 파일을 다운로드 (저장)하려고합니다.Python 2.6을 사용하여 웹에서 이진 파일을 저장하는 가장 효율적인 메모리 방법은 무엇입니까?

필자가 알고 있듯이 read(), readline() 및 readlines()는 파일과 유사한 객체를 읽는 3 가지 방법입니다. 바이너리 파일은 실제로 개행 문자로 분리되지 않으므로 read() 및 readlines()는 전체 파일을 메모리로 읽습니다.

임의의 read() 버퍼 크기를 선택하는 것이이 프로세스 동안 메모리 사용을 제한하는 가장 효율적인 방법입니까?

즉이 근무하고 아래로 RAM 사용량을 유지 임의 때문에

내가 읽은 선택했다
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 

(1000000). 나는 전송 속도가 너무 낮 으면 버퍼가 건조해질 수 있기 때문에 임의의 양을 선택하는 원시 네트워크 버퍼로 작업 중이 었다고 생각한다. 하지만 그것은 urllib이 이미 나를위한 저수준 버퍼링을 처리하고있는 것 같습니다.

이를 염두에두고, 임의의 숫자를 선택하는 것이 좋습니다. 더 좋은 방법이 있습니까?

감사합니다.

답변

2

이 경우 urllib.urlretrieve을 사용해야합니다. 그것은 당신을 위해 모든 것을 다룰 것입니다.

1

독자적인 읽기 - 쓰기 루프를 사용하는 대신 shutil 모듈을 체크 아웃해야합니다. copyfileobj 메서드를 사용하면 버퍼링을 정의 할 수 있습니다. 가장 효율적인 방법은 상황에 따라 다릅니다. 네트워크 문제로 인해 동일한 소스 파일을 동일한 대상에 복사 할 수도 있습니다.