我有50亿个密钥可以从一个区域复制到另一个区域。目前,我正在进行线程处理和多处理,但我得到的结果对我的需求来说有点慢。对于1000个PUT
复制请求,我可以从8秒到近2分钟(平均约50秒)。这将需要将近一年的时间才能完成。
有谁知道更快的解决方法?我正在阅读关于python的asyncore模块,它看起来很有希望,但它让我很困惑。如何将boto与asyncore集成?
答案 0 :(得分:2)
不幸的是,当需要大量请求时,API可能效率很低。
HTTP开销在这里起着重要作用。 针对API投掷5个COPY请求将需要一段时间,以传统方式等待每个响应需要很长时间(如您所说,年份),即使使用线程,因为每个请求都会阻塞一个线程。
因此,您使用非阻塞异步连接的想法是一个很好的开始。
不幸的是,我不是一个优秀的python开发人员所以我无法真正帮助你在boto中替换底层的http客户端。
This guys已使用tornado.httpclient
完成了这项工作(他们说,快速而肮脏)也许您可以使用它来了解如何实现asyncore
答案 1 :(得分:1)
使用asyncore可能会有所帮助,但我不认为最终结果会比线程解决方案快得多。如果我在S3中有50亿个对象移动,我会找到一种方法将这个工作分成尽可能多的EC2实例。困难的部分是找到一种在工人实例之间分配工作的方法。
您可以使用list_keys
收集存储桶中所有对象的列表,然后在SQS中为每个需要移动的对象排队消息。然后启动所有从同一队列读取的N EC2实例。然而,即使列出密钥也需要很长时间,然后排队50亿条消息也需要一段时间。
如果对象在S3上自然分区,您可以利用它。例如,如果存在伪层次结构,则可以使用不同的prefix
启动每个实例。
如果您将对象名称存储在单独的数据库中,则可以生成N个单独的对象键文件,并将一个文件传递给每个N EC2实例。
可能还有其他可能性。如果没有关于您的具体情况的更多细节,很难知道。但是,如果你想在合理的时间内完成这项工作,我认为你需要找到一些方法在EC2实例中推广工作。