S3バケツから300万オブジェクトをダウンロードする最速の方法
質問
Python + Boto + Multiprocessing、S3CMD、J3Tsetを使用してみましたが、それらすべてに苦労しています。
何か提案、おそらくあなたが使用してきた既製のスクリプト、または私が知らない別の方法ですか?
編集:
Eventlet+Botoは、以下に説明する価値のあるソリューションです。ここで良いイベントリファレンスの記事を見つけました http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html
以下で今使用しているPythonスクリプトを追加しました。
解決
さて、@Matt Billenstienのヒントに基づいた解決策を見つけました。 Eventlet Libraryを使用しています。ここでは、最初のステップが最も重要です(標準のIOライブラリのモンキーパッチング)。
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を使用してI/O並列性を示し、urllibを使用して1つのオブジェクトをダウンロードする単純な関数を記述し、グリーンパイルを使用して入力URLのリストにマッピングします。
所属していません StackOverflow