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