Dask计算图是否可以保留中间数据,因此无需重新计算?
我对Dask印象深刻,我正在尝试确定它是否是解决我问题的正确工具。我正在构建一个交互式数据探索项目,用户可以交互地更改图形的参数。有时这些更改需要重新计算整个管道以生成图形(例如“显示来自不同时间间隔的数据”),但有时不需要。例如,“更改平滑参数”不应要求系统重新加载未平滑的原始数据,因为基础数据是相同的,只有处理过程发生了更改。系统应改为使用已加载的现有原始数据。我希望我的系统能够保留中间数据对象,并根据数据可视化的哪些参数已更改,智能地确定需要重新运行图形中的哪些任务。看起来Dask中的缓存系统与我所需要的很接近,但在设计时考虑了一些不同的用例。我看到有一个Dask计算图是否可以保留中间数据,因此无需重新计算?,dask,Dask,我对Dask印象深刻,我正在尝试确定它是否是解决我问题的正确工具。我正在构建一个交互式数据探索项目,用户可以交互地更改图形的参数。有时这些更改需要重新计算整个管道以生成图形(例如“显示来自不同时间间隔的数据”),但有时不需要。例如,“更改平滑参数”不应要求系统重新加载未平滑的原始数据,因为基础数据是相同的,只有处理过程发生了更改。系统应改为使用已加载的现有原始数据。我希望我的系统能够保留中间数据对象,并根据数据可视化的哪些参数已更改,智能地确定需要重新运行图形中的哪些任务。看起来Dask中的缓存
persist
方法,但我不确定这是否可行。在Dask有没有一个简单的方法来实现这一点,或者有没有其他更合适的项目
“更改平滑参数”不应要求系统重新加载原始非平滑数据
两种选择:
functools.lru\u cache
将缓存每个唯一的输入。使用maxsize
参数检查内存,该参数控制存储多少输入/输出对persist
,将按照中所述计算该对象。在以后的计算中,不需要重新运行计算来获取对象;在功能上,它与lru\u缓存
相同>>将dask.dataframe作为dd导入
>>>df=dd.read_csv(…)
>>>#df=df.persist()#取消对此行的注释→ 仅从磁盘读取一次
>>>df[df.x>0].mean().compute()
24.9
>>>df[df.y>0].mean().compute()
0.1
未注释该行意味着该代码只从磁盘读取一次,因为CSV的任务图是计算出来的,并且该值存储在内存中。对于您的应用程序,听起来我会智能地使用persist
:
如果要可视化两个平滑参数,该怎么办?在这种情况下,我会避免重复调用compute
:
lower,upper=client.compute(df.x.min(),df.x.max())
这将共享min
和max
的任务图,因此不会执行不必要的计算
我希望我的系统能够保留中间数据对象,并根据数据可视化的哪些参数已更改,智能地确定需要重新运行图形中的哪些任务
分布式Dask具有智能缓存功能:。部分文件说
另一种方法是观察所有中间计算,并猜测哪些计算可能对未来有价值。Dask具有一种机会主义缓存机制,用于存储显示以下特征的中间任务:
我想这就是你想要的;它将根据这些属性存储值。注意,图形合并策略,即
dask.compute(d.min(),d.max())
在我的情况下不起作用,因为我不知道在未来将执行什么操作智能缓存看起来很接近,但我不喜欢“智能”部分。我不希望Dask决定何时缓存任务。我希望始终缓存每个任务的结果,并且只保留每个任务的最新结果。我知道这与目标用例不同,但是否可以通过更改设置来实现这一点?内置functools.lru_缓存就是您要寻找的。注意:更改maxsize参数将更改缓存的唯一输入数。