如何在Dask中有效地从DataFrame转到多个系列?

时间:2017-07-06 17:07:44

标签: dask

我正在尝试找到一种在Dask中将DataFrame转换为一堆持久Series(列)的有效方法。

考虑一种情况,其中数据大小远远大于工作者内存的总和,并且大多数操作将被从磁盘读取 / 溢出到磁盘。对于仅在单个列(或列对)上运行的算法,对于每个列操作从磁盘读入整个DataFrame是低效的。在这种情况下,最好从本地(可能是持久的)DataFrame切换到持久化列。天真实施:

persisted_columns = {}
for column in subset_of_columns_to_persist:
    persisted_columns[column] = df[column].persist()

这很有效,但效率非常低,因为df[column]会从磁盘重新读取整个DataFrame N = len(subset_of_columns_to_persist)次。是否可以根据单个读取磁盘反序列化操作单独提取和保留多个列?

注意:len(subset_of_columns_to_persist)是>> 1,即简单地将DataFrame投影到df[subset_of_columns_to_persist]并不是我正在寻找的解决方案,因为它在持久化单个列上仍然具有显着的I / O开销。

1 个答案:

答案 0 :(得分:2)

您可以使用dask.persist功能同时保留多个集合。这将分享中间体。

columns = [df[column] for column in df.columns]
persisted_columns = dask.persist(*columns)
d = dict(zip(df.columns, persisted_columns))