Boto3有一个托管复制方法,可以很好地处理单个对象。同样,它似乎有一个适用于集合的delete()
方法。但是如果我有一个对象集合(参见下面的objects
),似乎我可以进行批量操作的唯一方法是使用我自己的线程/进程池(为了简单起见,我使用多处理,但是并发.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)。
答案 0 :(得分:0)
不久前我不得不解决这个问题,当我准备解决这个问题时,我写了这个DesignDoc。
线程将是你最好的选择,因为这是一个 I/O 问题。我在 S3-migrator 的 s3 中编写了并发复制的实现。此外,由于我们的使用,我需要保持我正在复制和使用 mysql 的文件的状态。