Python:如何拆分字符串键空间(id)以便在mongoDB中并行处理数据

时间:2013-05-16 23:43:39

标签: python algorithm parallel-processing

简介

我有一个包含数百万个文档的mongo集群。每个文档都有一个字符串ID,如下所示:

00072312e0761c6554c3606b50a21119773f2f7d

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

最大ID:

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

最低身份证:

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

问题

现在我想启动固定数量的线程来处理数据,我想使用id by index在线程中平均分割整个数据集,例如:

数据集ID(订购者):

key1
key2
key3
key4

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

问题

如何计算给定的最大和最小键值的key3(中间字符串?)的值?

min key: 000001177ab8e0cd68586e93664911dbd549ab01
max key: 000724471401ce132f8be806b597cbd6ee9b070e

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

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

然后,您可以大致了解空间中有多少项目,这样您就可以通过除以可用的处理器数量和#34;,将多少个键分配给处理器。

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会将必要的前导零数添加到字符串中,以便按照字典顺序以适当的方式为您的密钥空间排序(我假设您需要的是什么)

我希望这有帮助!