将Dask DataFrame存储为pickle

时间:2018-01-30 09:55:45

标签: python pandas dataframe dask

我有一个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')

2 个答案:

答案 0 :(得分:6)

快速检查dask中可用的方法,这是不可能的。作为另一个答案,它仍然可以做,但我担心由于dask数据帧的最终分布式特性,它可能并不简单。

无论如何,如果我是你,我会通过另一种解决方案,并使用镶木地板作为存储。它为您提供与泡菜基本相同的优点,以及更多。

df.to_parquet('my_file.parquet')

虽然,如果你的计划是使用泡菜作为暂停'稍后恢复计算的方法,保存到实木复合地板并不会有帮助。

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

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

enter image description here

因此,我会重复自己。转到parquet文件,您将自己面向未来。除非你的用例与柱状/面向数据的用例非常不同。

答案 1 :(得分:2)

您可以尝试像对待任何其他物体一样腌制它 -     进口泡菜

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)

此外,请检查this有关酸洗数据帧的安全性以及可能会破坏的情况