Der schnellste Weg zum Download 3.000.000 Objekte aus einem S3-Bucket
Frage
Ich habe versucht mit Python + Boto + Multiprocessing, s3cmd und J3tset aber mit allen von ihnen zu kämpfen.
Alle Vorschläge, vielleicht ein fertiges Skript, das Sie verwendet haben, oder eine andere Art, wie ich weiß nicht, von?
EDIT:
eventlet + Boto ist eine lohnenswerte Lösung wie unten erwähnt. Gefunden ein guter eventlet Referenz Artikel hier http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html
Ich habe den Python-Skript hinzugefügt, dass ich jetzt unten bin mit.
Lösung
Okay, dachte ich, eine Lösung basierend auf @ Matt Billenstien des Hinweises. Es verwendet eventlet Bibliothek. Der erste Schritt ist sehr wichtig, hier (Affe Patchen von Standard-IO-Bibliotheken).
Führen Sie dieses Skript im Hintergrund mit nohup und du bist fertig.
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()
Andere Tipps
Verwenden Sie eventlet E / A-Parallelität zu geben, schreiben Sie eine einfache Funktion ein Objekt mit urllib zum Download, dann eine GreenPile verwenden, die Urls auf eine Liste von Eingangs abzubilden - einem Stapel mit 50 bis 100 greenlets tun sollte .. .