Передача нескольких итераций в мультипроцессорный 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()

0 ответов

Другие вопросы по тегам