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参数将更改缓存的唯一输入数。