Я пытаюсь сделать дорогостоящую часть моих вычислений pandas параллельной, чтобы ускорить все.Python Multiprocessing using Pool уходит рекурсивно haywire
Я уже успел сделать Multiprocessing.Pool работу с простым примером:
import multiprocessing as mpr
import numpy as np
def Test(l):
for i in range(len(l)):
l[i] = i**2
return l
t = list(np.arange(100))
L = [t,t,t,t]
if __name__ == "__main__":
pool = mpr.Pool(processes=4)
E = pool.map(Test,L)
pool.close()
pool.join()
Никаких проблем здесь. Теперь мой собственный алгоритм является немного более сложным, я не могу разместить его здесь в полной славе и страшным, так что я буду использовать некоторые псевдо-код, чтобы выделить то, что я делаю здесь:
import pandas as pd
import time
import datetime as dt
import multiprocessing as mpr
import MPFunctions as mpf --> self-written worker functions that get called for the multiprocessing
import ClassGetDataFrames as gd --> self-written class that reads in all the data and puts it into dataframes
=== Settings
=== Use ClassGetDataFrames to get data
=== Lots of single-thread calculations and manipulations on the dataframe
=== Cut dataframe into 4 evenly big chunks, make list of them called DDC
if __name__ == "__main__":
pool = mpr.Pool(processes=4)
LLT = pool.map(mpf.processChunks,DDC)
pool.close()
pool.join()
=== Join processed Chunks LLT back into one dataframe
=== More calculations and manipulations
=== Data Output
Когда я запускаю этот сценарий, происходит следующее:
Он читает данные.
Выполняет все вычисления и манипуляции до утверждения пула.
Внезапно он снова считывает данные, в четыре раза.
Затем он переходит в основной скрипт в четыре раза одновременно.
Все это рекурсивно каскадирует и идет с трудом.
Я прочитал, прежде чем это произойдет, если вы не будете осторожны, но я не знаю, почему это происходит здесь. Мой многопроцессорный код защищен требуемым основным-выражением имени (я на Win7 64), он всего 4 строки, у него есть теги close и join, он вызывает одну определенную рабочую функцию, которая затем вызывает вторую рабочую функцию в петля, вот и все. Насколько я знаю, он должен просто создать пул с четырьмя процессами, вызвать четыре процесса из импортированного скрипта, закрыть пул и подождать, пока все будет сделано, а затем просто продолжить сценарий. На стороне, у меня сначала были рабочие функции в том же скрипте, поведение было одинаковым. Вместо того, чтобы просто делать то, что находится в пуле, кажется, он перезапустил весь скрипт в четыре раза.
Может ли кто-нибудь просветить меня, что может вызвать подобное поведение? Кажется, мне не хватает какого-то принципиального понимания многопроцессорности Python.
Также я не знаю, важно ли это, я нахожусь на виртуальной машине, которая находится на мэйнфрейме моей компании.
Должен ли я использовать отдельные процессы вместо пула?
Я считаю, что лучше всего структурировать ваш код в функцию 'main' (и, возможно, разделить эту функцию на более мелкие функции ..., чтобы не иметь 100-строчной функции, которая делает много вещей), то единственная часть кода, которая не является определением класса/функции/переменной, имеет следующий вид: 'if __name__ == '__main__': main()'. Это гарантирует, что многопроцессорная обработка работает по назначению. Также обратите внимание, что глобальные переменные не поддаются поиску, поэтому добавление кода внутри функции обеспечит небольшое увеличение производительности. – Bakuriu