使用pyarrow在工作人员之间共享对象

时间:2019-02-07 20:51:49

标签: python pandas python-multiprocessing pyarrow

我想授予由multiprocessing.Pool.map()创建的多个工作进程对共享DataFrame的只读访问权限。

我想避免复制和腌制。

我知道可以使用pyarrow。但是,我发现他们的文档非常繁琐。有人可以举一个例子来说明如何做到吗?

1 个答案:

答案 0 :(得分:1)

https://github.com/apache/arrow/blob/master/python/examples/plasma/sorting/sort_df.py的示例是一个工作示例,使用Python多重处理在多个工作程序之间共享Pandas数据帧(请注意,它需要构建一个小的Cython库才能运行它)。

数据帧是通过Arrow's Plasma object store共享的。

如果您不受Python多重处理的束缚,则可以使用Ray以更简单的语法执行所需的操作。

要授予多个工作人员对Pandas数据框的只读访问权限,可以执行以下操作。

import numpy as np
import pandas
import ray

ray.init()

df = pandas.DataFrame(np.random.normal(size=(1000, 10)))

@ray.remote
def f(df):
    # This task will run on a worker and have read only access to the 
    # dataframe. For example, "df.iloc[0][0] = 1" will raise an exception.
    try:
        df.iloc[0][0] = 1
    except ValueError:
        pass
    return df.iloc[0][0]

# Serialize the dataframe with pyarrow and store it in shared memory.
df_id = ray.put(df)

# Run four tasks that have access to the dataframe.
result_ids = [f.remote(df_id) for _ in range(4)]

# Get the results.
results = ray.get(result_ids)

请注意,行df_id = ray.put(df)可以省略(您可以直接调用f.remote(df))。在那种情况下,df仍将存储在共享内存中并与工作人员共享,但是它将被存储4次(每次调用f.remote(df)一次),效率较低。