【问题标题】:Bulk copy with boto3使用 boto3 批量复制
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多