параллельное обновление словаря полки в python

У меня есть программа, которая берет очень большой входной файл и делает из него диктовку. Поскольку это никак не поместится в памяти, я решил использовать полку, чтобы записать ее на свой диск. Теперь мне нужно воспользоваться преимуществами нескольких ядер, доступных в моей системе (их 8), чтобы ускорить синтаксический анализ. Я подумал, что наиболее очевидный способ сделать это — разделить мой входной файл на 8 частей и одновременно запустить код во всех 8 частях. Проблема в том, что мне нужен только 1 словарь в конце. Их не 8. Итак, как мне использовать полку для параллельного обновления одного словаря?


person Amitash    schedule 15.07.2012    source источник


Ответы (2)


Я дал довольно подробный ответ здесь на Обработка одного файла из нескольких процессов в python

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

Идея состоит в том, что у вас есть один процесс, производящий ввод в очередь. Тогда у вас есть столько рабочих, сколько вы хотите, получая предметы в очереди и выполняя работу. По завершении они помещают результат в очередь результатов для чтения приемником. Преимущество заключается в том, что вам не нужно заранее вручную распределять свою работу. Просто произведите «ввод» и позвольте любому работнику, который будет прочитан, взять его и поработать над ним.

С помощью этого шаблона вы можете увеличивать или уменьшать количество рабочих процессов в зависимости от возможностей системы.

person jdi    schedule 15.07.2012

shelve не поддерживает одновременный доступ. Есть несколько вариантов достижения желаемого:

  1. Сделайте одну полку для каждого процесса, а затем объедините в конце.

  2. Пусть рабочие процессы отправляют свои результаты обратно главному процессу, например, через multiprocessing.Pipe; затем мастер сохраняет их на полке.

  3. Я думаю, вы можете заставить bsddb работать с одновременным доступом в API, похожем на полку, но у меня никогда не было необходимости делать это.

person Danica    schedule 15.07.2012
comment
Я рекомендую вариант 2. Довольно легко просто забыть об одновременной записи на полку и иметь один писатель, принимающий из очереди. Все воркеры разбирают и добавляют в очередь. Производитель-рабочий-раковина - person jdi; 15.07.2012