Совместное использование состояния между разветвленными рабочими процессами в высокопроизводительной среде

Это продолжение моегопредыдущий вопрос, Как предположил Тим Питерс, используяManager не обязательно может быть лучшим подходом. К сожалению, у меня слишком много кода, чтобы опубликоватьSSCCE, Вместо этого я постараюсь дать подробное объяснение моей проблемы. Пожалуйста, не стесняйтесь просматривать всю кодовую базу наGithub, но это немного беспорядок прямо сейчас.

Фон

Я занимаюсь исследованиями в области обработки естественного языка, и я хотел бы сделать (что-то вроде) словарное сглаживание для классификации документов. Идея обучить классификатор, чтобы связать слова и фразы с правильным ответом. Например, документы, содержащие словоsocialist скорее всего, о политике, и те, которые содержат фразуlava temperature скорее всего о геологии. Система обучается, глядя нанебольшое количество предварительно помеченных примеров. Поскольку язык настолько разнообразен, классификатор никогда не будет «знать» обо всех возможных фразах, с которыми он может столкнуться в процессе производства.

Это где словарь входит. Предположим, у нас былодешевый и простой способ получить синонимы для почти любой фразы там (я процитирую себя, потому что это плохой вкус). Когда плохой классификатор сталкивается с фразой, о которой он не знает, мы можем найти ее в упомянутом словаре и сказать классификатору: «Смотри, ты не знаешь оcommunism, but it's kinda like <code>socialist</code>, and you know about that!". If the dictionary is reasonable, the classifier will generally perform better.

Псевдокод
data = Load training and testing documents (300MB on disk)
dictionary = Load dictionary (200MB - 2GB on disk) and place into a `dict` for fast look-ups
Repeat 25 times:
    do_work(data, dictionary)

def do_work(data, dictionary)
    X = Select a random sample of data
    Train a classifier on X
    Y = Select a random sample of data
    Using dictionary, classify all documents in Y
    Write results to disk
Проблема

Цикл выше является идеальным кандидатом для распараллеливания. Я использую Python 2.7multiprocessing.Pool (черезjoblib.Parallelпотому что это легко и обеспечивает очень полезную трассировку, если дела пойдут на юг). Все рабочие процессы должны иметь доступ только для чтения к словарю и коллекции документов. Рабочим не нужно общаться друг с другом или с родительским процессом - все, что они делают, это порождают, делают немного магии, пишут файл и умирают.

Словарь должен поддерживать быстрый произвольный доступ. Я не знаю, какие документы образецY будет содержать, поэтому я не могу легко сократить словарь и передать только ту часть, которая нужна каждому работнику. К словарю будут обращаться очень часто - типичное число попаданий на один прогон исчисляется миллионами. В настоящее время мой код связан с памятью, так как (я считаю) копии коллекции документов и словаря создаются для каждого рабочего процесса. Когда разбираетсяdata а такжеdictionary обычно занимают несколько ГБ ОЗУ. Я пытался использоватьmultiprocessing.managers.BaseManager чтобы избежать копирования больших объектов, но это замедлило работу рабочих.

Вопрос

Какие есть альтернативы, чтобы ускорить процесс? Вещи, о которых я думал, включают:

MongoDB / CouchDB / memcached должен хорошо обрабатывать параллельный доступ, но я беспокоюсь о пропускной способности. zeromq также был предложен в комментарии к моему предыдущему вопросу, у меня не было возможности разобраться в этом.в памятиsqlite базы данных и соединения с базой данных не могут быть общими для всех процессов, поэтому каждому работнику потребуется собственное соединение с базой данных на диске. Это означает большое количество операций ввода-вывода и высокое использование памяти по мере роста кэша каждого рабочего.отображение памятииспользуя потоки вместо процессов

Это ТАК вопрос также предположил, что многие реальные проблемы, которые выглядят так, как будто им нужен доступ только для чтения кdict может вызватьfork()Копирование при записи, поэтому может быть невозможно полностью избежать копирования больших объектов.

Ответы на вопрос(1)

Ваш ответ на вопрос