Вопрос новичка о многопроцессорности Python? - PullRequest
3 голосов
/ 23 ноября 2010

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

Я хочу знать, ускоряет ли многопроцессорная обработка время, необходимое для выполнения таких операций?задачи.Я сделал

multiprocessing.cpu_count

, и он возвращает 8. Я пробовал что-то вроде

process = []
for i in range(4):
    if i == 3:
        limit = resultsSize - (3 * division)
    else:
        limit = division

    #limit and offset indicates the subset of records the function would fetch in the db
    p = Process(target=sub_table.processR,args=(limit,offset,i,))
    p.start()
    process.append(p)
    offset += division + 1

for po in process:
    po.join()

, но, видимо, прошловыше, чем время, необходимое для запуска одного потока.Почему это так?Может кто-нибудь просветить, это подходящий случай или что я тут не так делаю?

Ответы [ 3 ]

5 голосов
/ 23 ноября 2010

Почему это так?

Может кто-нибудь объяснить, в каких случаях многопроцессорная обработка дает лучшие результаты?

Вот один прием.

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

Общий ресурс (например, база данных) будет перемещаться в 8 различных направлениях, что не приносит реальной выгоды.

Чтобы найти ресурс без общего доступа, у вас должны быть независимые объекты.Как список, который уже в памяти.

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

Или 8 разных файлов.Обратите внимание, что файловая система - в целом - является общим ресурсом, и некоторые виды доступа к файлам включают совместное использование чего-либо, например, диска или каталога.

Или конвейер из 8 меньших шагов.Стандартный трюк Unix-конвейера query | process1 | process2 | process3 >file работает лучше, чем что-либо еще, потому что каждый этап в конвейере полностью независим.

Вот еще один трюк.

Ваша компьютерная система (ОС, устройства, база данных)сеть и т. д.) настолько сложны, что упрощенные теории вообще не могут объяснить производительность.Вам нужно (а) провести несколько измерений и (б) попробовать несколько разных алгоритмов, пока вы не поймете все степени свободы.

Вопрос типа «Может ли кто-нибудь объяснить, в каких случаях многопроцессорная обработка дает лучшие результаты?»простого ответа нет.

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

1 голос
/ 23 ноября 2010

Вот пара вопросов:

  1. В вашей функции processR он отбрасывает большое количество записей из базы данных за один раз или получает по 1 строке за раз? (Каждая выборка строки будет очень дорогой, с точки зрения производительности.)

  2. Это может не работать для вашего конкретного приложения, но так как вы обрабатываете «все», использование базы данных, скорее всего, будет медленнее, чем простой файл. Базы данных оптимизированы для логических запросов, а не для последовательной обработки. В вашем случае, вы можете экспортировать весь столбец таблицы в файл CSV, обработать его, а затем повторно импортировать результаты?

Надеюсь, это поможет.

1 голос
/ 23 ноября 2010

В общем случае многоядерная или многоядерная обработка помогают больше всего, когда ваша проблема связана с процессором (т. Е. Проводит большую часть своего времени, пока процессор работает так быстро, как может).

Из вашего описания у вас есть проблема, связанная с вводом-выводом: получение данных с диска в ЦП (который находится в режиме ожидания) занимает много времени, а затем ЦП работает очень быстро (потому что это так просто).

Таким образом, ускорение работы процессора в целом не имеет большого значения.

...