MemoryError: cómo descargar archivos grandes a través del SDK de Google Drive usando Python

Me estoy quedando sin memoria cuando descargo un archivo grande desde mi Google Drive. Supongo que tmp = content.read(1024) no funciona, pero ¿cómo solucionarlo? Gracias.

 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 

La solución correcta sería implementar la descarga parcial. Con este proceso, solicitará trozos de diferente longitud de un archivo hasta que se descargue por completo. Aquí hay una referencia del proceso: https://developers.google.com/drive/web/manage-downloads#partial_download .

Aquí está el código de trabajo completo.

 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