从S3存储桶中下载300万个物体的最快方法
题
我已经尝试使用Python + Boto +多处理,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的提示找到了一种解决方案。它使用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下载一个对象,然后使用绿色PILE将其映射到输入URL列表中 - 具有50至100 Greenlets的堆应该做...
不隶属于 StackOverflow