我是Python的新手,如果这是一个愚蠢的问题,我想道歉。
我目前正在从事一项开发工作,以执行多项数据检查。
简而言之,我有一个主数据帧,需要对其他一些数据帧的数据进行验证。
我所做的代码在单核上正常工作,但是由于数量庞大,我将需要实现多核处理。问题是我找不到如何将多个熊猫数据框作为参数传递给功能模块。
请注意,主要数据集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()
我当前收到的错误是功能模块仅接收到一个参数,如下所示:
TypeError: apply_scores_test() missing 2 required positional arguments:
'change_log' and 'parameters'
有人对我开始多处理时如何将3个pandas数据帧传递给功能模块有任何线索吗?
更新:我尝试使用multiprocessing.pool.starmap
而不是map
进行更多测试,并且收到相同的错误。
我也尝试使用partial
,但由于我至少需要使用参数,而且据我了解,“部分”仅适用于2个参数,因此也不起作用。
我对数据帧有任何其他想法,我将不胜感激。
非常感谢。
账单
答案 0 :(得分:0)
作为链接,请考虑使用封装在上下文管理器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)