Python: разделить большой словарь объектов между несколькими процессами

Я читал о том, как совместно использовать большой объект в родительском процессе, для которого нужны дочерние процессы read-only доступ. Возможно, мне не хватает некоторых важных постов. Кажется, я не нахожу четкого ответа для операций, которые зависят от всего объекта (всегда разбиваются на части и раздаются работникам или проходят через фильтры).

Давайте рассмотрим следующую проблему. У меня есть около 300 векторов с плавающей точкой, один миллион из них. Допустим, они загружены в numpy массивы float32 DTYPE. Каждый вектор связан с ключом string,

Давайте сохраним это отношение ключ-значение (строка-массив) в dict, Теперь у меня есть большой объект в памяти.

Давайте рассмотрим мой родительский процесс как server процесс. Ловит запросы вида "key1,key2", Ожидается, что он рассчитает и вернет парное евклидово расстояние между ключом 1 и ключом 2. Дочерние процессы создаются для одновременной обработки нескольких запросов.

Нельзя разделить словарь на части, потому что пользовательские запросы могут быть любого рода. Также ребенку нужно заняться делом о том, что ключ не найден и т. Д.

Как мне обрабатывать дочерние процессы, которые зависят в режиме только для чтения от всего словаря в multiprocessing?

Обновления:

  1. Числа в этом вопросе являются гипотетическими
  2. dict может быть заменен любым объектом, подобным хеш-таблице, и поддерживать отношение ключ-значение
  3. Было бы хорошо, если бы я мог прочитать и десериализовать объект только один раз

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() делится между несколькими процессами.

Другие вопросы по тегам