从S3存储桶下载300万个对象的最快方法

我已经尝试过使用Python + boto +多处理,S3cmd和J3tset,但都在苦苦挣扎。

任何build议,也许是一个你已经使用的现成的脚本,或者我不知道的另一种方式?

编辑:

如下所述,eventlet + boto是一个有价值的解决scheme。 在这里find一个很好的eventlet参考文章http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html

我已经添加了下面我正在使用的python脚本。

好吧,我根据@Matt Billenstien的提示找出了一个解决方案。 它使用eventlet库。 第一步在这里最重要(标准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编写一个简单的函数来下载一个对象,然后使用GreenPile将其映射到输入url的列表 – 一个有50到100个greenlet的堆应该做…