多个Pandas数据帧作为多进程参数

6

我对Python还比较新,所以如果这是一个愚蠢的问题,我想道歉。

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

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

我的代码在单核上运行良好,但由于数据量大,我需要实现多核处理。问题在于我找不到如何将多个Pandas数据框作为参数传递给函数模块。

请注意,主数据集“purchase_orders”已经在进程之间拆分,因此每个进程将接收到1/4的数据。其他数据框应该更小,而且完全相同,因此如果有办法让生成的进程访问主进程创建的数据框,那么也可以,因为我只会从它们读取数据。

数据框“change_log”和“parameters”将在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()

我目前收到的错误是函数模块只接受一个单一参数,如下所示:
TypeError: apply_scores_test() missing 2 required positional arguments: 
'change_log' and 'parameters'

有人知道在启动多进程时如何将三个pandas数据框传递给函数模块吗?
更新:我尝试了更多的测试,使用multiprocessing.pool.starmap而不是map,但我收到相同的错误消息。 我也尝试使用partial,但它也不起作用,因为我至少需要使用3个参数,据我所知,'partial'仅适用于2个参数。
如果有任何其他关于数据框的想法,我将非常感激。
提前感谢您的帮助。
比尔

这个问题可能会对您感兴趣:https://dev59.com/dG035IYBdhLWcg3wZvJg - rahlf23
非常感谢提供的帖子。在发布之前,我尝试查找了一些内容,但没有找到这些。我现在正在查看。 - W Oliverio
1个回答

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接