Простой пример кеширования dask. Кеш не работает должным образом. Предположим, у нас есть список данных и ряд отложенных функций, ожидаемых от функции, которая встречает тот же ввод, чтобы кэшировать / запоминать результаты в соответствии с оценкой кеширования.
Этот пример демонстрирует, что это не так.
import time
import dask
from dask.cache import Cache
from dask.diagnostics import visualize
from dask.diagnostics import Profiler, ResourceProfiler, CacheProfiler
def slow_func(x):
time.sleep(5)
return x+1
output = []
data = np.ones((100))
for x in data:
a = dask.delayed(slow_func)(x)
output.append(a)
total = dask.delayed(sum)(output)
cache = Cache(2e9)
cache.register()
with Profiler() as prof, ResourceProfiler(dt=0.25) as rprof,CacheProfiler() as cprof:
total.compute()
visualize([prof, rprof, cprof])
cache cprof plot
После первоначального параллельного выполнения функции ожидается следующая итерация после вызова функции с тем же значением для использования версии кеша . Но, очевидно, нет, dask_key_name предназначен для обозначения одного и того же вывода, но я хочу оценить эту функцию для различных входов и, если вижу тот же вход, используйте кешированную версию. Мы можем сказать, происходит ли это очень легко с этой функцией из-за 5-секундной задержки, и должны увидеть, что она выполняется примерно через 5 секунд, как только первое значение будет кэшировано после выполнения. В этом примере каждая функция выполняется с задержкой на 5 секунд. Я могу создать мемоизированную версию напрямую с помощью библиотеки cachey, но это должно работать с библиотекой dask.cache.