python - Dask 中具有可重用自定义图表的机会缓存

标签 python caching dask

Dask支持定义custom computational graphs以及opportinistic caching 。问题是它们如何一起使用。

例如,让我们定义一个非常简单的计算图,用于计算 x+1 运算,

import dask

def compute(x):
    graph = {'step1': (sum, [x, 1])}
    return dask.get(graph, 'step1')

print('Cache disabled:', compute(1), compute(2))

这会按预期产生 23

现在我们启用机会缓存,

from dask.cache import Cache

cc = Cache(1e9)
cc.register()

print('Cache enabled: ', compute(1), compute(2))
print(cc.cache.data)

在这两种情况下,我们都错误地得到了 2 的结果,因为 cc.cache.data{'step1': 2}输入的。

我想这意味着需要对输入进行哈希处理(例如使用 dask.base.tokenize 并将其附加到图中的所有键。是否有更简单的方法,特别是从 the tokenize function is not part of the public API 开始?

问题是,在复杂的图表中,随机步骤名称需要考虑提供给其子步骤的所有输入的哈希值,这意味着有必要进行完整的图表解析。

最佳答案

重要的是,dask 图中的键名称是唯一的(如您在上面发现的)。此外,我们希望相同的计算具有相同的 key ,这样我们就可以避免多次计算它们 - 但这对于 dask 工作来说并不是必需的,它只是提供了一些优化的机会。

在 dask 的内部,我们使用 dask.base.tokenize计算输入的“哈希”,从而产生确定性的键名称。您也可以自由使用此功能。在您上面链接的问题中,我们说该函数是公共(public)的,只是实现可能会发生变化(而不是签名)。

另请注意,对于许多用例,我们建议使用 dask.delayed现在代替自定义图表来生成自定义计算。这将在幕后为您执行确定性哈希。

关于python - Dask 中具有可重用自定义图表的机会缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48183849/

相关文章:

python - 将 Pandas 数据帧转换为 Dask 数据帧

python - 本地使用 dask : to Client() or not to Client()?

python - Caffe:快完成了,但卡在最后一步

python - 将 DataFrame 列标题设置为 MultiIndex

mysql - 高流量下的 Varnish 高数据库连接

python - 如何检查在 Dask 上调用计算是否安全?

python - Django : How to login user directly after registration using generic CreateView

python - 程序流中应该发生的文件写入没有发生

java - 查询 Hibernate 缓存而不是数据库

swift - 如何使用 SDWebImage 快速缓存图像?