将 Dask DataFrame 存储为 pickle

Store a Dask DataFrame as a pickle

我有一个 Dask DataFrame 构造如下:

import dask.dataframe as dd

df = dd.read_csv('matrix.txt', header=None)
type(df) //dask.dataframe.core.DataFrame

有没有办法将这个 DataFrame 保存为 pickle?

例如,

df.to_pickle('matrix.pkl')

您可以像处理任何其他对象一样尝试对它进行酸洗 - 进口泡菜

with open('filename.pickle', 'wb') as handle:
    pickle.dump(df, handle, protocol=pickle.HIGHEST_PROTOCOL)

with open('filename.pickle', 'rb') as handle:
    b = pickle.load(handle)
print(a == b)

此外,请检查 pickling dask 数据帧的安全性以及在什么情况下可能会损坏

从对 dask 中可用方法的快速检查来看,这是不可能直接实现的。仍然可以像另一个答案那样做,但我担心由于 dask 数据框的最终分布式性质,它可能并不简单。

无论如何,如果我是你,我会通过另一种解决方案并使用 parquet 作为存储。它为您提供了与 pickle 基本相同的优点,甚至更多。

df.to_parquet('my_file.parquet')

尽管如此,如果您计划将 pickle 用作 'suspend' 稍后恢复计算的方法,保存到 parquet 并没有多大帮助。

到目前为止,我的建议是使用镶木地板。查看此 post,其中比较了存储通用 pandas 数据帧的不同技术。您会看到他们甚至不讨论泡菜(它有一些问题,比如它可能在两个 python 版本之间不兼容)。文章略旧,现在pandas/dask可以直接使用parquet而不需要显式使用pyarrow.

我猜你对阅读时间很感兴趣。文件大小和读取时间之间总是存在权衡。尽管在文章中显示当您考虑多核操作时,您可以获得与压缩镶木地板文件类似的读取性能(Parquet-snappy 列)

因此,我会重复一遍。选择 parquet 文件,您将面向未来。除非您的用例与面向 columnar/dataframe 的用例有很大不同。