Могут ли вычислительные графы Dask хранить промежуточные данные, поэтому повторные вычисления не требуются? - PullRequest
0 голосов
/ 25 мая 2020

Я очень впечатлен Dask, и я пытаюсь определить, подходит ли он для моей проблемы. Я создаю проект для интерактивного исследования данных, в котором пользователи могут интерактивно изменять параметры фигуры. Иногда эти изменения требуют пересчета всего конвейера для построения графика (например, «показать данные из другого временного интервала»), но иногда нет. Например, «изменение параметра сглаживания» не должно требовать, чтобы система перезагружала необработанные несглаженные данные, потому что базовые данные те же самые, изменяется только обработка. Вместо этого система должна использовать существующие необработанные данные, которые уже были загружены. Я хотел бы, чтобы моя система могла поддерживать промежуточные объекты данных и разумно определять, какие задачи на графике необходимо повторно запустить, в зависимости от того, какие параметры визуализации данных были изменены. Похоже, что система кеширования в Dask близка к тому, что мне нужно, но была разработана с учетом немного другого варианта использования. Я вижу, что существует метод persist, но я не уверен, что он сработает. Есть ли простой способ выполнить sh это в Dask, или есть другой проект, который был бы более подходящим?

1 Ответ

1 голос
/ 25 мая 2020

«изменить параметр сглаживания» не требует от системы перезагрузки необработанных несглаженных данных.

Два варианта:

  1. Встроенная functools.lru_cache будет кэшировать каждый уникальный ввод. Проверка памяти выполняется с помощью параметра maxsize, который контролирует, сколько пар ввода / вывода хранится.
  2. Использование persist в нужных местах будет вычислять этот объект, как указано в https://distributed.dask.org/en/latest/manage-computation.html#client -персист . Не потребуется повторного выполнения вычислений, чтобы получить объект в последующих вычислениях; функционально это то же самое, что lru_cache.

Например, этот код будет читать с диска дважды:

>>> import dask.dataframe as dd
>>> df = dd.read_csv(...)
>>> # df = df.persist()  # uncommenting this line → only read from disk once
>>> df[df.x > 0].mean().compute()
24.9
>>> df[df.y > 0].mean().compute()
0.1

Строка без комментария означает, что этот код читает только с диска один раз, потому что граф задач для CSV вычисляется, а значение сохраняется в памяти. Для вашего приложения это звучит так, как будто я бы использовал persist разумно: https://docs.dask.org/en/latest/best-practices.html#persist -when-you-can

Что, если нужно визуализировать два параметра сглаживания? В этом случае я бы избегал повторного вызова compute: https://docs.dask.org/en/latest/best-practices.html#avoid -calling-compute-again

lower, upper = client.compute(df.x.min(), df.x.max())

Это разделит график задач для min и max, поэтому ненужные вычисления не выполняются.

Я хотел бы, чтобы моя система могла хранить промежуточные объекты данных и разумно определять, какие задачи на графике необходимо повторно запускать в зависимости от того, какие изменены параметры визуализации данных.

Dask Distributed имеет возможность интеллектуального кэширования: https://docs.dask.org/en/latest/caching.html#automatic -opportunisti c -caching . В части документации указано:

Другой подход - наблюдать за всеми промежуточными вычислениями и угадывать, какие из них могут оказаться полезными для использования в будущем. В Dask есть механизм кэширования c, в котором хранятся промежуточные задачи со следующими характеристиками:

  1. Дорого в вычислении
  2. Недорого хранить
  3. Часто используется

Думаю, это то, что вы ищете; он будет хранить значения в зависимости от этих атрибутов.

...