如何在不实际传递数据集的情况下并行化数据操作?
“ my_fun”采用df列的子集,并执行一些计算。 我想并行化“ my_fun”,因为df包含许多列,并且my_func需要应用于df的许多子集。 计划是使用pool.starmap。
pool.starmap需要在列表中输入my_func存储,并且在执行期间,列表中的每个元素将并行地馈送到my_func中。我的困境是df是一个非常大的数据集,要准备输入星图,我必须将df多次存储到列表中,这会耗尽内存。
def my_fun(col1, col2, new_col_name, df):
return (new_col_name, df[col1] + df[col2])
df = pd.DataFrame([[1,2,3], [10, 20, 30], [100, 200, 300]])
in_list = [(1,0,10,df), (2,0,20, df), (1,2,12,df)]
pool = Pool(4)
res = pool.starmap(my_fun, in_list)
关于优化上述代码的任何建议,这样我就不必将df存储到“ in_list”中n次,其中n是在并行执行期间将调用my_func的次数?
答案 0 :(得分:0)
您应该了解,您要存储N个对同一DataFrame的引用,而不是N个单独的副本。因此,从技术上讲,您所做的没有错。
我想为了提供MWE,my_fun
是一个伪函数,但是如果可能的话,您应该尝试在没有multiprocessing
的情况下向量化此操作。
但是要回答您的问题,我将使用df.pipe
来functools.partial
,因此您最终会使用不同的参数来调用同一函数。
def my_fun(df, col1, col2, new_col_name): # note the argument order.
return (new_col_name, df[col1] + df[col2])
df = pd.DataFrame([[1,2,3], [10, 20, 30], [100, 200, 300]])
in_list = [(1,0,10), (2,0,20), (1,2,12)] # note `df` is gone from the argument list.
from functools import partial
pool = Pool(4)
res = pool.starmap(partial(df.pipe, my_fun), in_list)