繁体   English   中英

使用 boto3 批量复制

[英]Bulk copy with boto3

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 无论如何)。

不久前我不得不解决这个问题,当我准备解决这个问题时,我写了这个DesignDoc

线程将是您最好的选择,因为这是一个 I/O 问题。 我在S3-migrator上的 s3 中编写了并发复制的实现。 此外,由于我们的使用,我需要保持我正在复制和使用 mysql 的文件的状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM