列出大型S3存储桶中所有密钥的多线程可能算法?

时间:2012-01-09 00:39:51

标签: rest amazon-s3 concurrent-programming

在包含大量密钥的S3存储桶中,通过REST API列出密钥是一个非常缓慢的过程,因为

  1. 您一次只能列出1000个密钥。
  2. 确定第5001个密钥(据我所知)的唯一方法是列出前1000个密钥,根据响应中的下一个标记列出下一个密钥,然后递归直到达到5001。
  3. S3 REST api请求的延迟非常高,1000个密钥的请求通常需要几秒钟。
  4. 鉴于制作100个并发键列表REST请求不应该减慢任何单个请求的速度,否则此过程将通过并行化进行优化。但是如果我的算法是“愚蠢的”并且只是将可能的密钥空间分成预定义的标记(例如,'','a','b','c','d','e'...... )它不会真正加速在每个键以'images /'

    开头的桶中列出键

    所以我想知道是否真的有S3经验的人知道更好的方法来遍历存储桶的密钥空间,或者是否有人尝试使用自适应(即“非愚蠢”)算法来改进并发的密钥列表。

1 个答案:

答案 0 :(得分:1)

也许某种形式的“二元搜索”算法会有所帮助吗? EG以''和'm'开头,然后是中途,等等。我认为你最终会得到每个键最多两次左右 - 当你已经拥有'nextmarker'时,你就停止要求更多。

如何选择开头数量?我认为可能会在每个周期进行细分:启动''然后当这些结果返回时,如果''结果表明更多的键,则在该搜索上启动'nextmarker'并在'nextmarker'和'z'之间的一半进行新的搜索。重复。使用类似哈希的东西只存储一次所有键。

由于所有请求都是以不同的线程等形式进入的,因此您需要锁定才能添加所有键。然后你有一个问题就是保持锁定打开不会减慢速度,所以它取决于你正在使用的语言等。

如果您的进程在与S3文件相同的区域中的EC2实例上运行,则可以更快地执行此操作。假设文件是​​美国“标准”。然后你很幸运,你可以使用ruby和Ironworker之类的东西进入并下载所有密钥。完成后,它可以发布到您的服务器,或在S3上创建一个文件,该文件是所有密钥或类似的列表。对于不同的地区或语言,您可能需要启动自己的EC2实例。

我发现在EC2实例上S3键列表要快得多,因为每个请求都有很多带宽(你不需要为EC2付费)。 S3没有gzip响应,这是非常蓬松的XML,所以你和S3之间的带宽是至关重要的。