Question

J'ai essayé d'utiliser Python + Boto + multitraitement, s3cmd et J3tset mais aux prises avec tous.

Toutes les suggestions, peut-être un script prêt à l'emploi que vous avez utilisé ou d'une autre façon, je ne connais pas?

EDIT:

eventlet + boto est une solution intéressante, comme mentionné ci-dessous. Trouvé un bon article de référence eventlet ici http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html

J'ai ajouté le script python que j'utilise en ce moment ci-dessous.

Était-ce utile?

La solution

D'accord, je me suis dit à une solution basée sur l'indice de Billenstien @ Matt. Il utilise eventlet bibliothèque. La première étape est la plus importante ici (patching singe des bibliothèques standard IO).

Exécuter ce script en arrière-plan avec nohup et vous êtes tous ensemble.

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()

Autres conseils

Utilisez eventlet pour vous donner le parallélisme d'E / S, écrire une fonction simple à télécharger un objet à l'aide urllib, puis utiliser un GreenPile pour mapper une liste des urls d'entrée - une pile de 50 à 100 greenlets devrait faire .. .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top