Domanda

Ho provato con Python + boto + multiprocessing, S3cmd e J3tset ma alle prese con tutti loro.

Qualche suggerimento, forse uno script già pronti hai utilizzato o in un altro modo in cui io non conosco?

Modifica

eventlet + boto è una soluzione utile come indicato di seguito. Abbiamo trovato un buon articolo eventlet riferimento qui http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html

Ho aggiunto lo script python che sto usando in questo momento al di sotto.

È stato utile?

Soluzione

Va bene, ho capito una soluzione basata su suggerimento di @ Matt Billenstien. Esso utilizza eventlet biblioteca. Il primo passo è più importante qui (scimmia patch di librerie standard IO).

eseguire questo script in background con nohup e sei a posto.

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

Altri suggerimenti

Usa eventlet per darvi I / O il parallelismo, scrivere una funzione semplice per scaricare un oggetto utilizzando urllib, quindi utilizzare un GreenPile per mappare che a un elenco di URL di ingresso - un palo con 50 a 100 greenlets dovrebbe fare .. .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top