У меня есть программа, которая берет очень большой входной файл и делает из него диктовку. Поскольку это никак не поместится в памяти, я решил использовать полку, чтобы записать ее на свой диск. Теперь мне нужно воспользоваться преимуществами нескольких ядер, доступных в моей системе (их 8), чтобы ускорить синтаксический анализ. Я подумал, что наиболее очевидный способ сделать это — разделить мой входной файл на 8 частей и одновременно запустить код во всех 8 частях. Проблема в том, что мне нужен только 1 словарь в конце. Их не 8. Итак, как мне использовать полку для параллельного обновления одного словаря?
параллельное обновление словаря полки в python
Ответы (2)
Я дал довольно подробный ответ здесь на Обработка одного файла из нескольких процессов в python
Не пытайтесь выяснить, как вы можете одновременно записывать на полку множество процессов. Подумайте о том, как вы можете сделать так, чтобы один процесс доставлял результаты на полку.
Идея состоит в том, что у вас есть один процесс, производящий ввод в очередь. Тогда у вас есть столько рабочих, сколько вы хотите, получая предметы в очереди и выполняя работу. По завершении они помещают результат в очередь результатов для чтения приемником. Преимущество заключается в том, что вам не нужно заранее вручную распределять свою работу. Просто произведите «ввод» и позвольте любому работнику, который будет прочитан, взять его и поработать над ним.
С помощью этого шаблона вы можете увеличивать или уменьшать количество рабочих процессов в зависимости от возможностей системы.
shelve
не поддерживает одновременный доступ. Есть несколько вариантов достижения желаемого:
Сделайте одну полку для каждого процесса, а затем объедините в конце.
Пусть рабочие процессы отправляют свои результаты обратно главному процессу, например, через
multiprocessing.Pipe
; затем мастер сохраняет их на полке.Я думаю, вы можете заставить bsddb работать с одновременным доступом в API, похожем на полку, но у меня никогда не было необходимости делать это.