多个 pandas 数据帧作为多处理的参数

W O*_*rio 6 multiprocessing dataframe pandas

我对 Python 有点陌生,所以如果这是一个愚蠢的问题,我想道歉。

我目前正在开发一项执行多项数据检查的开发。

简而言之,我有一个主数据框,需要根据其他数据框的数据进行验证。

我所做的代码在单核上正常工作,但由于体积的原因,我需要实现多核处理。问题是我找不到如何将多个 pandas 数据帧作为参数传递给函数模块。

请注意,主数据集purchase_orders已经在进程之间进行了分割,因此每个进程将收到1/4的数据。其他数据帧应该更小并且完全相同,因此如果有一种方法可以使生成的进程访问在主进程上创建的数据帧也很好,因为我只会从中读取数据。

数据帧change_log和参数将在apply方法中使用。

代码如下:

# this is the code I would like to call for multi processing
def apply_scores_test(purchase_orders, change_log, parameters):
    print('Running multicore')
    size = 1
    g_first = 'X'
    g_results = 'START'
    g_temp_lifnr = 'X'
    purchase_orders = purchase_orders.apply(calculate_scores, axis=1)
    return purchase_orders

# Starting the multi-core processing (locked to 4 process to make it easier to test)
p = multiprocessing.Pool(4) 
args = [(g_purchase_orders_1, change_log, parameters), (g_purchase_orders_2, change_log, parameters), (g_purchase_orders_3, change_log, parameters),(g_purchase_orders_4, change_log, parameters),]
res = p.map(apply_scores_test, args)
p.close()
p.join()
Run Code Online (Sandbox Code Playgroud)

我当前收到的错误是功能模块仅接收一个参数,如下所示:

TypeError: apply_scores_test() missing 2 required positional arguments: 
'change_log' and 'parameters'
Run Code Online (Sandbox Code Playgroud)

有人知道当我开始多重处理时如何将 3 个 pandas 数据帧传递给功能模块吗???

multiprocessing.pool.starmap更新:我尝试使用而不是进行更多测试,map但收到相同的错误。我也尝试使用,partial但也不起作用,因为我至少需要使用参数,并且据我所知,“部分”仅适用于 2 个参数。

如果有人对数据框有任何其他想法,我将不胜感激。

预先非常感谢。

账单

Par*_*ait 1

如链接所示,请考虑使用封装starmap在上下文管理器中的with. 对于 Windows,请确保在内部运行多处理if __name__ == '__main__':

import multiprocessing
...

args = [(g_purchase_orders_1, change_log, parameters), 
        (g_purchase_orders_2, change_log, parameters), 
        (g_purchase_orders_3, change_log, parameters),
        (g_purchase_orders_4, change_log, parameters)]

if __name__ == '__main__':
    with multiprocessing.Pool(processes=4) as p:

        # LIST OF RETURNED DATAFRAMES
        results = p.starmap(apply_scores_test, args)

        # OUTPUT RESULTS
        for r in results:
            print(r)
Run Code Online (Sandbox Code Playgroud)