2

介绍

我有一个 mongo 集群,里面有几百万个文档。每个文档都有一个字符串 id,如下所示:

00072312e0761c6554c3606b50a21119773f2f7d

我有一种方法可以从 mongo 中检索第一个和最后一个键

最大标识:

find().sort( { _id : -1 } ).limit(1).next()._id

最小身份证:

find().sort( { _id : 1 } ).limit(1).next()._id

问题

现在我想启动固定数量的线程处理数据,并且我想使用 id 索引在线程之间平均分割整个数据集,例如:

数据集 ID(订购者):

key1
key2
key3
key4

通过这个小示例,我希望能够启动 2 个线程,其中一个要处理的线程从 key2(包括)开始并在 key3 上结束,另一个线程从 key3 开始并在 key4 上结束。

问题

对于像这样的给定最大和最小键值,如何计算 key3 的值(中间字符串?)?

min key: 000001177ab8e0cd68586e93664911dbd549ab01
max key: 000724471401ce132f8be806b597cbd6ee9b070e

提前致谢!

4

1 回答 1

0

您应该尝试估计空间中不同值的数量。在这种情况下,ID 看起来像是一个十六进制字符串,因此您应该先将它们转换为整数:

my_min_key = int('mylowkey', 16)
my_max_key = int('myhighkey', 16)

然后,您可以知道空间中大约有多少项目,这将让您通过除以可用“处理器”的数量,将有多少键分配给处理器。

keys_for_each_processor = (my_max_key - my_min_key) / my_number_of_processors

之后,计算每个部分的不同下限并将其转换回十六进制字符串,使其与您的键空间匹配 - 然后您可以使用大于运算符来划分查询。

key_bounds = dict()

for proc_num in xrange(0, number_of_processors):
    key_bounds[proc_num] = add_padding(format(my_min_key + proc_num * keys_for_each_processor))

在哪里add_padding将必要的前导零的数量添加到字符串中,以便以正确的方式为您的键空间按字典顺序排序(我假设这就是您所需要的)。

我希望这有帮助!

于 2013-05-17T16:44:47.883 回答