2

はじめに

数百万のドキュメントを含む mongo クラスターがあります。各ドキュメントには、次のような文字列 ID があります。

00072312e0761c6554c3606b50a21119773f2f7d

そして、mongoから最初と最後のキーを取得する方法があります

最大 ID:

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

最小 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 は 16 進文字列のように見えるため、最初にそれらを int に変換する必要があります。

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

その後、各セクションのさまざまな下限を計算し、それを 16 進文字列に変換してキースペースと一致させます。その後、大なり演算子を使用してクエリを分割できます。

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 に答える