2014-12-23 3 views
1

Google 드라이브에서 대용량 파일을 다운로드 할 때 메모리가 부족합니다. tmp = content.read(1024)이 작동하지 않겠지 만 해결 방법은 무엇입니까? 감사합니다.MemoryError - Python을 사용하여 Google 드라이브 SDK를 통해 대용량 파일을 다운로드하는 방법

def download_file(service, file_id): 
    drive_file = service.files().get(fileId=file_id).execute() 
    download_url = drive_file.get('downloadUrl') 
    title = drive_file.get('title') 
    originalFilename = drive_file.get('originalFilename') 
    if download_url: 
    resp, content = service._http.request(download_url) 
    if resp.status == 200: 
     file = 'tmp.mp4' 
     with open(file, 'wb') as f: 
      while True: 
       tmp = content.read(1024) 
       if not tmp: 
        break 
       f.write(tmp) 
     return title, file 
    else: 
     print 'An error occurred: %s' % resp 
     return None 
    else: 
    return None 

답변

0

다음은 완전한 작동 코드입니다.

def partial(total_byte_len, part_size_limit): 
    s = [] 
    for p in range(0, total_byte_len, part_size_limit): 
     last = min(total_byte_len - 1, p + part_size_limit - 1) 
     s.append([p, last]) 
    return s 



def GD_download_file(service, file_id): 
    drive_file = service.files().get(fileId=file_id).execute() 
    download_url = drive_file.get('downloadUrl') 
    total_size = int(drive_file.get('fileSize')) 
    s = partial(total_size, 100000000) // I'm downloading BIG files, so 100M chunk size is fine for me 
    title = drive_file.get('title') 
    originalFilename = drive_file.get('originalFilename') 
    filename = '/some_path/' + originalFilename 
    if download_url: 
     with open(filename, 'wb') as file: 
     for bytes in s: 
      headers = {"Range" : 'bytes=%s-%s' % (bytes[0], bytes[1])} 
      resp, content = service._http.request(download_url, headers=headers) 
      if resp.status == 206 : 
       file.write(content) 
       file.flush() 
      else: 
      print 'An error occurred: %s' % resp 
      return None 
     return title, filename 
    else: 
    return None