параллельные вычисления на python: разделить пространство ключей, чтобы дать каждому узлу диапазон для работы - PullRequest
1 голос
/ 21 марта 2010

Мой вопрос довольно сложен для объяснения, поскольку я не очень хорош в математике, но я постараюсь быть максимально ясным.

Я пытаюсь кодировать кластер в python, который будет генерировать слова с заданной кодировкой (то есть с строчными буквами: aaaa, aaab, aaac, ..., zzzz) и выполнять над ними различные операции. Я ищу, как вычислить, учитывая набор символов и количество узлов, в каком диапазоне должен работать каждый узел (то есть: узел1: aaaa-azzz, узел2: baaa-czzz, узел3: daaa-ezzz, ...) Можно ли сделать алгоритм, который мог бы вычислить это, и если это так, как я мог бы реализовать это в Python?

Я действительно не знаю, как это сделать, поэтому любая помощь будет высоко ценится

Ответы [ 2 ]

1 голос
/ 22 марта 2010

Вы должны быть в состоянии рассматривать ваши слова как цифры в странной базе. Например, предположим, что у вас есть a..z в качестве вашей кодировки (26 символов), 4 строки символов, и вы хотите распределить их по 10 машинам. Тогда есть в общей сложности 26 ^ 4 строки, поэтому каждая машина получает 26 ^ 4/10 строк. Первая машина получит строки от 0 до 26 ^ 4/10, следующие от 26 ^ 4/10 до 26 ^ 4/5 и т. Д.

Чтобы преобразовать числа в строки, просто напишите число в базе 26, используя вашу кодировку в качестве чисел. Итак, 0 - это «аааа», а 26 ^ 4/10 = 2 * 26 ^ 3 + 15 * 26 ^ 2 + 15 * 26 +15 - это «cppp» * 1003

1 голос
/ 22 марта 2010

Любой способ, которым вы можете вычислить небольшое целое число из строки, подойдет для кластеризации.Например, вычислите хеш с помощью md5 и посмотрите на его байт:

import hashlib

s = "aaac"
num_nodes = 5 # or whatever
m = hashlib.md5(s)
node = ord(m.digest()[0]) % num_nodes

print node  # prints 2

Это не гарантирует равномерное распределение всех строк, но оно будет близко.

...