如何在不实际传入数据集的情况下并行化数据操作?
"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时间?
您应该了解,您存储的是 N 个对同一数据帧的引用,而不是它的 N 个单独的副本。所以,从技术上讲,你正在做的事情并没有错。
我想my_fun
是为了提供 MWE 而是一个虚拟函数,但如果可能的话,您应该尝试在没有multiprocessing
的情况下矢量化此操作。
但是要回答你的问题,我会使用functools.partial
来讨好df.pipe
,所以你最终会用不同的参数调用同一个函数。
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)