Передача нескольких итераций в мультипроцессорный pool.map
У меня есть следующая функция (some_function), которую я передаю в pool.map. Код работает, но он значительно медленнее, чем последовательная обработка. Примечательно, что у меня есть 4 миллиона сгруппированных объектов, поэтому желание идти параллельно.
Я думаю, что замедление происходит из-за того, что dict_dfs (словарь данных) используется совместно. Таким образом, если доступно 5 ядер, возможно, когда пяти группам, обрабатываемым параллельно, необходим доступ к одному и тому же фрейму данных в словаре фреймов данных. Правильно ли мое рассуждение? Если так, то как мне преодолеть эту проблему?
Функция для сопоставления
def some_function(grp_list, cm, dict_dfs):
"""
This function takes a single group object from the grp_list, performs
some operations on it and returns the grouped object as a dataframe.
Args:
cm = float64
dict_dfs = a dictionary of dataframes, one of which is accessed and some
operations on it.
grp_list = a list of grouped objects saved to a list
Return:
returns the grp_list as a dataframe after performing some operations
"""
# Operates on the grp_list and does something cool
return (df)
Подготовьте grp_list и словарь данных.
for name, group in df.groupby('som_col'):
grp_list.append(group)
dict_dfs = Function_to_build_dictionary_dfs()
сделать частичную функцию и запустить pool.map
cm = 0.3
func_partial = partial(some_function, cm = cm, dict_dfs = dict_dfs)
pool = Pool(cpu_cores)
with pool as p:
result_dfs = p.map(func_partial,grp_list)
control_parameters.logger.info("Multiprocessing completed")
pool.close()
pool.join()