如何使用boto在Amazon S3桶中高效地复制一个目录下的所有文件到另一个目录?

6 投票
1 回答
3835 浏览
提问于 2025-04-17 12:43

我需要把亚马逊S3存储桶里'/old/dir/'下的所有文件复制到'/new/dir/'。我写了一个脚本(算是临时解决方案):

import boto

s3 = boto.connect_s3()
thebucket = s3.get_bucket("bucketname")
keys = thebucket.list('/old/dir')
for k in keys:
    newkeyname = '/new/dir' + k.name.partition('/old/dir')[2]
    print 'new key name:', newkeyname
    thebucket.copy_key(newkeyname, k.bucket.name, k.name)

现在这个脚本可以工作,但速度比我在图形管理界面里用鼠标复制粘贴要慢得多。这让我很沮丧,因为要复制的文件很多...

你知道有没有更快的方法吗?谢谢。

补充:也许我可以通过同时进行多个复制操作来加快速度。我对boto的复制方法不太熟悉,也不知道可以同时发送多少个操作给亚马逊。

补充2:我现在正在学习Python的多进程处理。看看我能不能同时发送50个复制操作...

补充3:我尝试用Python的多进程模块同时进行30个复制操作。这个速度比在控制台里快多了,而且出错的可能性也小了。不过遇到了一个新问题,就是大文件(超过5GB)时,boto会抛出异常。我需要先调试这个问题,再发布更新的脚本。

1 个回答

1

关于你提到的5GB以上文件的问题:S3不支持使用PUT方法上传超过5GB的文件,而boto正是尝试用这种方法来上传的(查看boto源代码亚马逊S3文档)。

很遗憾,我不太确定你该如何解决这个问题,除了先下载文件,然后再用分块上传的方式重新上传。我觉得boto目前还不支持分块复制操作(如果这样的功能存在的话)。

撰写回答