Варианты кеширования / заметок / hashирования в R

Я пытаюсь найти простой способ использовать что-то вроде хеш-функций Perl в R (по сути, кеширование), поскольку я намеревался сделать как hash-стиль в стиле Perl, так и написать свое собственное описание вычислений. Тем не менее, другие избили меня до удара и имеют пакеты для воспоминаний. Чем больше я копаю, тем больше я нахожу, например memoise и R.cache , но различия не совсем ясны. Кроме того, неясно, как еще можно получить hashи Perl-стиля (или словари в стиле Python) и написать собственную memoization, кроме как использовать hash пакет, который, похоже, не лежит в основе двух пакетов memoization.

Поскольку я не могу найти никакой информации о CRAN или где-либо еще, чтобы провести различие между параметрами, возможно, это должен быть вопрос сообщества wiki о SO: Каковы варианты memoization и кеширования в R и каковы их отличия?


В качестве основы для сравнения, вот список вариантов, которые я нашел. Кроме того, мне кажется, что все зависит от hashирования, поэтому я также заметлю варианты hashирования. Хранение ключей / значений несколько связано, но открывает огромную возможность червей относительно систем БД (например, BerkeleyDB, Redis, MemcacheDB и множество других ).

Похоже, что варианты:

хеширования

  • digest – обеспечивает хеширование для произвольных объектов R.

мемоизации

  • memoise – очень простой инструмент для memoization функций.
  • R.cache – предлагает больше функциональности для memoization, хотя, похоже, некоторые из функций не имеют примеров.

Кэширование

  • hash – предоставляет функции кэширования, сродни хешам Perl и словарям Python.

Хранение ключей / значений

Это основные опции для внешнего хранения объектов R.

  • stashr
  • filehash

Checkpointing

  • cacher – это, похоже, более сродни контрольной точке .
  • CodeDepends – проект OmegaHat, который подкрепляет cacher и предоставляет некоторые полезные функции.
  • DMTCP (не R-пакет) – похоже, поддерживает контрольную точку на множестве языков, а разработчик недавно искал помощь в тестировании контрольной точки DMTCP в R.

Другие

  • Base R поддерживает: названные векторы и списки, имена строк и столбцов фреймов данных и имена элементов в средах. Мне кажется, что использование списка – это немного клочья. (Существует также pairlist , но он устарел .)
  • Пакет data.table поддерживает быстрый поиск элементов в таблице данных.

Случай использования

Хотя мне больше всего интересно узнать варианты, у меня есть два основных варианта использования:

  1. Кэширование: простой подсчет строк. [Примечание. Это не для НЛП, а для общего использования, поэтому библиотеки НЛП переполнены; таблицы неадекватны, потому что я предпочитаю не ждать, пока весь набор строк будет загружен в память. Хеши в стиле Perl находятся на правильном уровне полезности.]
  2. Воспоминание чудовищных расчетов.

Это действительно происходит из-за того, что я вникаю в профилирование некоторого кода slooooow, и мне бы очень хотелось просто подсчитать простые строки и посмотреть, могу ли я ускорить некоторые вычисления с помощью memoization. Имея возможность хешировать входные значения, даже если я не memoize, позволит мне посмотреть, может ли memoization помочь.


Примечание 1: В представлении задачи CRAN по воспроизводимому исследованию перечислены несколько пакетов ( cacher и R.cache ), но нет никаких подробностей о вариантах использования.

Примечание 2: Чтобы помочь другим, ищущим связанный код, здесь несколько примечаний к некоторым из авторов или пакетов. Некоторые авторы используют SO. 🙂

  • Dirk Eddelbuettel: digest – от этого зависит множество других пакетов.
  • Роджер Пэн: cacher , filehash , stashR – это разные проблемы по-разному; см . сайт Роджера для большего количества пакетов.
  • Кристофер Браун: hash – кажется, полезный пакет, но ссылки на ODG, к сожалению, отсутствуют.
  • Хенрик Бенгтссон: R.cache & Hadley Wickham: memoise – пока неясно, когда предпочесть один пакет над другим.

Примечание 3: Некоторые люди используют memoise / memoisation, другие используют memoize / memoization. Просто заметьте, если вы ищете. Хенрик использует «z», а Хэдли использует «s».

3 Solutions collect form web for “Варианты кеширования / заметок / hashирования в R”

Для простого подсчета строк (а не с использованием table или аналогичного) структура мультимножества данных кажется подходящей. Объект environment может использоваться для подражания этому.

 # Define the insert function for a multiset msetInsert < - function(mset, s) { if (exists(s, mset, inherits=FALSE)) { mset[[s]] <- mset[[s]] + 1L } else { mset[[s]] <- 1L } } # First we generate a bunch of strings n <- 1e5L # Total number of strings nus <- 1e3L # Number of unique strings ustrs <- paste("Str", seq_len(nus)) set.seed(42) strs <- sample(ustrs, n, replace=TRUE) # Now we use an environment as our multiset mset <- new.env(TRUE, emptyenv()) # Ensure hashing is enabled # ...and insert the strings one by one... for (s in strs) { msetInsert(mset, s) } # Now we should have nus unique strings in the multiset identical(nus, length(mset)) # And the names should be correct identical(sort(ustrs), sort(names(as.list(mset)))) # ...And an example of getting the count for a specific string mset[["Str 3"]] # "Str 3" instance count (97) 

Мне не повезло с memoise потому что она давала too deep recursive проблему для некоторой функции упакованного мною, с которым я пытался работать. С R.cache мне повезло. Ниже приведен более аннотированный код, который я адаптировал из документации R.cache . В коде показаны различные варианты кэширования.

 # Workaround to avoid question when loading R.cache library dir.create(path="~/.Rcache", showWarnings=F) library("R.cache") setCacheRootPath(path="./.Rcache") # Create .Rcache at current working dir # In case we need the cache path, but not used in this example. cache.root = getCacheRootPath() simulate < - function(mean, sd) { # 1. Try to load cached data, if already generated key <- list(mean, sd) data <- loadCache(key) if (!is.null(data)) { cat("Loaded cached data\n") return(data); } # 2. If not available, generate it. cat("Generating data from scratch...") data <- rnorm(1000, mean=mean, sd=sd) Sys.sleep(1) # Emulate slow algorithm cat("ok\n") saveCache(data, key=key, comment="simulate()") data; } data <- simulate(2.3, 3.0) data <- simulate(2.3, 3.5) a = 2.3 b = 3.0 data <- simulate(a, b) # Will load cached data, params are checked by value # Clean up file.remove(findCache(key=list(2.3,3.0))) file.remove(findCache(key=list(2.3,3.5))) simulate2 <- function(mean, sd) { data <- rnorm(1000, mean=mean, sd=sd) Sys.sleep(1) # Emulate slow algorithm cat("Done generating data from scratch\n") data; } # Easy step to memoize a function # aslo possible to resassign function name. This would work with any functions from external packages. mzs <- addMemoization(simulate2) data <- mzs(2.3, 3.0) data <- mzs(2.3, 3.5) data <- mzs(2.3, 3.0) # Will load cached data # aslo possible to resassign function name. # but different memoizations of the same # function will return the same cache result # if input params are the same simulate2 <- addMemoization(simulate2) data <- simulate2(2.3, 3.0) # If the expression being evaluated depends on # "input" objects, then these must be be specified # explicitly as "key" objects. for (ii in 1:2) { for (kk in 1:3) { cat(sprintf("Iteration #%d:\n", kk)) res <- evalWithMemoization({ cat("Evaluating expression...") a <- kk Sys.sleep(1) cat("done\n") a }, key=list(kk=kk)) # expressions inside 'res' are skipped on the repeated run print(res) # Sanity checks stopifnot(a == kk) # Clean up rm(a) } # for (kk ...) } # for (ii ...) 

Связано с решением @biocyperman . R.cache имеет функцию обертывания, чтобы избежать загрузки, сохранения и оценки кеша. См. Измененную функцию:

R.cache предоставляет оболочку для загрузки, оценки, сохранения. Вы можете упростить свой код:

 simulate < - function(mean, sd) { key <- list(mean, sd) data <- evalWithMemoization(key = key, expr = { cat("Generating data from scratch...") data <- rnorm(1000, mean=mean, sd=sd) Sys.sleep(1) # Emulate slow algorithm cat("ok\n") data}) } 
  • Как бы вы реализовали кеш LRU в Java?
  • Размер строки кешей L1 и L2
  • Android: очистить кеш всех приложений?
  • WPF TabControl - предотrotation разгрузки при изменении вкладки?
  • Расseleniumие изображения UIImageNamed: FUD
  • Как настроить кеш статического содержимого для каждой папки и расширения в IIS7?
  • Memcached против Redis?
  • Почему размер кеша L1 меньше, чем размер кэша L2 на большинстве процессоров?
  • Отключить кеш браузера для всего веб-сайта ASP.NET
  • Как очистить кеш gradleации?
  • Как кэшировать fragmentы карты Google для автономного использования?
  • Давайте будем гением компьютера.