La forma más rápida para descargar 3 millones de objetos a partir de un depósito de S3
Pregunta
He intentado usar Python + + boto multiprocesamiento, S3cmd y J3tset pero luchando con todos ellos.
Cualquier sugerencia, tal vez un guión ya hecho que ha estado utilizando o de otra manera no conozco?
EDIT:
eventlet + boto es una solución que vale la pena como se menciona a continuación. Encontrado un artículo de buena referencia eventlet aquí http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html
He añadido el script en Python que estoy usando ahora mismo a continuación.
Solución
De acuerdo, me di cuenta de una solución basada en la insinuación de Billenstien @ Matt. Utiliza eventlet biblioteca. El primer paso es el más importante en este caso (parches mono de bibliotecas estándar IO).
Ejecutar este proceso en el fondo 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()
Otros consejos
Uso eventlet para darle E / S paralelismo, escribir una función simple para descargar un objeto usando urllib, a continuación, utilizar un GreenPile al mapa que a una lista de URL de entrada - una pila con 50 a 100 Verdecillo debe hacer .. .