【发布时间】:2018-06-29 07:25:50
【问题描述】:
Boto3 有一个托管复制方法,它非常适用于单个对象。同样,它似乎有一个适用于集合的delete() 方法。但是,如果我有一组对象(请参阅下面的objects),似乎我可以进行批量操作的唯一方法是使用我自己的线程/进程池(为了简单起见,我使用多处理,但 concurrent.futures可能更适合错误处理)。
import boto3
import multiprocessing
bucket_name = '1000genomes'
prefix = 'changelog_details/'
bucket = boto3.resource('s3').Bucket(bucket_name)
objects = bucket.objects.filter(Prefix=prefix).limit(30)
sources = [{'Bucket': o.bucket_name, 'Key': o.key} for o in objects]
target_bucket = 'my-bucket' # fill in bucket here!
def copy_to_bucket(src, bucket=target_bucket):
# client is not thread-safe according to docs
s3 = boto3.resource('s3')
return s3.meta.client.copy(src, bucket, src['Key'])
pool = multiprocessing.Pool(20)
results = pool.map(copy_to_bucket, sources)
print('Copied %d results' % len(results))
我是否遗漏了有关如何批量执行此操作的一些内容?我试图查看 aws-cli 代码库和/或 S3Transfer 类,但它们似乎都专注于上传或下载文件。
如果做不到这一点,有没有想过线程或进程是否是更好的选择? (我认为大多数服务器端副本只是在等待网络 I/O)。
【问题讨论】:
-
底层 S3 服务 API 支持多对象删除操作,但不支持复制,这可能解释了为什么一个具有本机支持而另一个没有。
标签: python amazon-web-services amazon-s3 boto3