python linux amazon-s3 boto eventlet

python - La manera más rápida de descargar 3 millones de objetos de un cubo S3



linux amazon-s3 (2)

De acuerdo, descubrí una solución basada en la pista de @Matt Billenstien. Utiliza la biblioteca de eventos. El primer paso es más importante aquí (parche mono de bibliotecas IO estándar).

Ejecute este script en segundo plano con nohup y ya está todo listo.

from eventlet import * patcher.monkey_patch(all=True) import os, sys, time from boto.s3.connection import S3Connection from boto.s3.bucket import Bucket import logging logging.basicConfig(filename="s3_download.log", level=logging.INFO) def download_file(key_name): # Its imp to download the key from a new connection conn = S3Connection("KEY", "SECRET") bucket = Bucket(connection=conn, name="BUCKET") key = bucket.get_key(key_name) try: res = key.get_contents_to_filename(key.name) except: logging.info(key.name+":"+"FAILED") if __name__ == "__main__": conn = S3Connection("KEY", "SECRET") bucket = Bucket(connection=conn, name="BUCKET") logging.info("Fetching bucket list") bucket_list = bucket.list(prefix="PREFIX") logging.info("Creating a pool") pool = GreenPool(size=20) logging.info("Saving files in bucket...") for key in bucket.list(): pool.spawn_n(download_file, key.key) pool.waitall()

He intentado usar Python + boto + multiprocesamiento, S3cmd y J3tset, pero estoy luchando con todos ellos.

¿Alguna sugerencia, tal vez una secuencia de comandos ya hecha que has estado usando o de otra manera que yo desconozco?

EDITAR:

eventlet + boto es una solución que vale la pena como se menciona a continuación. Encontré un buen artículo de referencia de evento aquí http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html

He añadido el script de python que estoy usando ahora mismo a continuación.


Use eventlet para darle un paralelismo de E / S, escriba una función simple para descargar un objeto usando urllib, luego use un GreenPile para asignarlo a una lista de urls de entrada, una pila con 50 a 100 comodines debería hacer ...