大熊猫数据框并行处理

2024-03-09

我正在访问一个非常大的 Pandas 数据框作为全局变量。该变量通过并行访问joblib https://pythonhosted.org/joblib/parallel.html.

Eg.

df = db.query("select id, a_lot_of_data from table")

def process(id):
    temp_df = df.loc[id]
    temp_df.apply(another_function)

Parallel(n_jobs=8)(delayed(process)(id) for id in df['id'].to_list())

以这种方式访问​​原始 df 似乎是跨进程复制数据。这是意外的,因为原始 df 在任何子进程中都没有被更改? (或者是吗?)


对于 joblib 创建的每个进程,整个 DataFrame 都需要进行 pickle 和 unpickle。在实践中,这是非常慢的,并且还需要每个的许多倍的内存。

一种解决方案是将数据存储在 HDF 中(df.to_hdf)使用表格格式。然后你可以使用select选择数据子集进行进一步处理。实际上,这对于交互式使用来说太慢了。它也非常复杂,您的工作人员需要存储他们的工作,以便在最后一步中进行整合。

另一种选择是探索numba.vectorize with target='parallel'。这需要使用 NumPy 数组而不是 Pandas 对象,因此它也有一些复杂性成本。

从长远来看,dask https://github.com/blaze/dask希望为 Pandas 带来并行执行,但这并不是很快就能实现的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大熊猫数据框并行处理 的相关文章

随机推荐