Самый быстрый способ загрузить 3 миллиона предметов из ведра S3

StackOverflow https://stackoverflow.com/questions/4720735

Вопрос

Я пытался использовать Python + Boto + Multiprocessing, S3CMD и J3TSET, но боролся со всеми из них.

Любые предложения, возможно, готовый сценарий, который вы использовали, или другой способ, о котором я не знаю?

РЕДАКТИРОВАТЬ:

Eventlet+Boto - достойное решение, как упомянуто ниже. Нашел здесь хорошую справочную статью Eventlet здесь http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html

Я добавил сценарий Python, который я использую прямо сейчас ниже.

Это было полезно?

Решение

Хорошо, я выяснил решение, основанное на подсказке @Matt Billenstien. Он использует библиотеку событий. Первый шаг здесь наиболее важен (обезьяна стандартных библиотек ввода -вывода).

Запустите этот скрипт в фоновом режиме с nohup, и все готово.

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

Другие советы

Используйте Eventlet, чтобы дать вам параллелизм ввода/вывода, напишите простую функцию для загрузки одного объекта с помощью Urllib, затем используйте GreenPile, чтобы составить это в список входных URL -адресов - куча с 50-100 Greenlets должна сделать ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top