Кеширование вызовов функций в R
Кэширование функций позволяет кэшировать возвращаемые значения функций в зависимости от аргументов. Это может помочь сэкономить время при работе с вводом/выводом на повторяющихся данных при длительных вычислениях. Т.е. при вызове функции запоминаются значения аргументов, и полученный результат, и в случае повторного вызова функции с теми же параметрами, результат вычислений будет считан из кеша, и вам не потребуется ждать пока пройдут все вычисления повторно.
Это может быть полезно например при обращении к справочникам по API, если данные в этих справочниках меняются не особо часто. Вряд ли вы каждые 3 минуты запускаете новые рекламные кампании.
В R кеширование функций в удобном виде позволяет реализовать пакет memoise, построенный на основе пакета cachem.
Простейший пример кеширования функции
Что бы кешировать любую функцию, используйте memoise().
library(memoise)
f <- function(x) {
Sys.sleep(1)
mean(x)
}
mf <- memoise(f)
Используем кешированную функцию:
# первый запуск проводит расчёты и запоминает результат
system.time(mf(1:10))
#> user system elapsed
#> 0.002 0.000 1.003
# далее мы читаем результат из кеша
system.time(mf(1:10))
#> user system elapsed
#> 0.000 0.000 0.001
Конфигурация кеширования
Вы можете управлять такими параметрами кеширования как:
● место физического хранения кеша
● длительность хранение кеша
● максимально допустимый размер кеша
По умолчанию кеш сохраняется в оперативной памяти функцией cachem::cache_mem(), и хранится только в течении текущей R сессии. Но вы можете использовать функцию cachem::cache_disk(), и хранить кеш на жестком диске.
Дополнительные аргументы функций cachem::cache_mem() и cachem::cache_disk() позволяют управлять размером кеша, директорией хранения кеша и некоторыми другими параметрами.
# Ограничиваем длительность хранения кеша 15 минутами
cm <- cachem::cache_mem(max_age = 15 * 60)
mf <- memoise(f, cache = cm)
# Хранить кеш внутри каталога "R-myapp" на уровне пользователя
# папка "C:/Users/Username/AppData/Local/R-myapp/R-myapp/Cache"
cd <- cachem::cache_disk(rappdirs::user_cache_dir("R-myapp"))
mf <- memoise(f, cache = cd)
Ссылки:
- Примеры кода взяты из README пакета memoise
#заметки_по_R