大Pandas数据帧并行处理

2024-04-29 02:54:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我将访问一个非常大的Pandas数据帧作为全局变量。此变量通过joblib并行访问。

例如

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在任何子进程中都没有被更改?(或者是?)


Tags: of数据idpandasdfdbdata进程
2条回答

Python多处理通常使用单独的进程来完成,正如您所注意到的,这意味着进程不共享内存。如果您可以使用np.memmap这是一个潜在的解决方法,正如在joblib文档的后面提到的,尽管转储到磁盘显然会增加一些自身的开销:https://pythonhosted.org/joblib/parallel.html#working-with-numerical-data-in-shared-memory-memmaping

对于joblib创建的每个进程,需要对整个数据帧进行pickle和unpickle操作。在实践中,这是非常缓慢的,也需要很多倍的记忆。

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

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

从长远来看,dask希望能给熊猫带来并行执行,但这不是很快就能实现的。

相关问题 更多 >