gpt4 book ai didi

python - 使用boto3批量复制

转载 作者:行者123 更新时间:2023-12-03 13:42:12 34 4
gpt4 key购买 nike

Boto3具有托管复制方法,该方法对单个对象非常有效。同样,它似乎有一个适用于集合的delete()方法。但是,如果我有一组对象(请参见下面的objects),似乎可以执行批量操作的唯一方法是使用自己的线程/进程池(为简化起见,我正在使用多处理程序,但并发。 future 更好地处理错误)。

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。

关于python - 使用boto3批量复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351518/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com