Я пытаюсь использовать многопроцессорную работу в Jupyter Notebooks, которую нужно настроить немного иначе, чем обычно.
Пример кода ниже включает рабочий пример с использованием обычного l oop.
Пример многопроцессорной обработки завершается ошибкой, поскольку df
и scipy
недоступны для функции многопроцессорной обработки.
Т.е.: NameError: name 'df' is not defined
.
import scipy
import pandas as pd
import multiprocessing
df=pd.DataFrame(columns=['Col'])
df['Col']=[i for i in range(1,10)]
def enum_indexes():
for fromrow in df.itertuples(index=True):
for torow in df.itertuples(index=True):
yield (fromrow.Index,torow.Index)
#Regular example that works fine.
resultlist=[]
for e in enum_indexes():
value_1=df.iloc[e[0]]
value_2=df.iloc[e[1]]
result= scipy.mean([value_1,value_2])
resultlist.append(result)
#For multiprocessing to work in Jupyter, it's necessary to have the worker function in a separate module.
#This function is in my_module.py
def worker_func(e):
value_1=df.iloc[e[0]]
value_2=df.iloc[e[1]]
result= scipy.mean([value_1,value_2])
return result
import my_module
resultlist=[]
if __name__ == '__main__':
pool=multiprocessing.Pool(processes=2)
for result in pool.imap(my_module.worker_func, enum_indexes()):
resultlist.append(result)
Я не мог понять, как применить инициализатор пула, но думаю, что это потенциальное решение.
В этом игрушечном примере я передаю индексы Pandas фрейм данных как итеративный к пулу. В конечном итоге я хотел бы, чтобы несколько процессов извлекали данные из фрейма данных и обрабатывали его с использованием любых необходимых пакетов.
Ценю любую помощь,
Спасибо