Python: разделить большой словарь объектов между несколькими процессами
Я читал о том, как совместно использовать большой объект в родительском процессе, для которого нужны дочерние процессы read-only
доступ. Возможно, мне не хватает некоторых важных постов. Кажется, я не нахожу четкого ответа для операций, которые зависят от всего объекта (всегда разбиваются на части и раздаются работникам или проходят через фильтры).
Давайте рассмотрим следующую проблему. У меня есть около 300 векторов с плавающей точкой, один миллион из них. Допустим, они загружены в numpy
массивы float32
DTYPE. Каждый вектор связан с ключом string
,
Давайте сохраним это отношение ключ-значение (строка-массив) в dict
, Теперь у меня есть большой объект в памяти.
Давайте рассмотрим мой родительский процесс как server
процесс. Ловит запросы вида "key1,key2"
, Ожидается, что он рассчитает и вернет парное евклидово расстояние между ключом 1 и ключом 2. Дочерние процессы создаются для одновременной обработки нескольких запросов.
Нельзя разделить словарь на части, потому что пользовательские запросы могут быть любого рода. Также ребенку нужно заняться делом о том, что ключ не найден и т. Д.
Как мне обрабатывать дочерние процессы, которые зависят в режиме только для чтения от всего словаря в multiprocessing
?
Обновления:
- Числа в этом вопросе являются гипотетическими
dict
может быть заменен любым объектом, подобным хеш-таблице, и поддерживать отношение ключ-значение- Было бы хорошо, если бы я мог прочитать и десериализовать объект только один раз
0 ответов
Вы можете использовать dict() из Manager, как следующий код:
from multiprocessing import Process, Manager
def f(d, l):
d[1] = '1'
d['2'] = 2
d[0.25] = None
l.reverse()
if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()
l = manager.list(range(10))
p = Process(target=f, args=(d, l))
p.start()
p.join()
print(d)
print(l)
Это печатает:
{0.25: None, 1: '1', '2': 2}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
dict()
делится между несколькими процессами.