问题标签 [memoise]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
11957 浏览

r - R中的缓存/记忆/散列选项

我试图找到一种简单的方法来在 R 中使用类似 Perl 的散列函数(本质上是缓存),因为我打算同时进行 Perl 风格的散列并编写我自己的计算记忆。然而,其他人已经打败了我,并且有用于记忆的包。我挖掘的越多,我发现的越多,例如memoiseR.cache,但区别并不容易清楚。hash此外,除了使用似乎不支持这两个 memoization 包的包之外,还不清楚如何获得 Perl 样式的哈希(或 Python 样式的字典)并编写自己的 memoization 。

由于我找不到关于 CRAN 或其他地方的信息来区分这些选项,也许这应该是关于 SO 的社区 wiki 问题:R 中的记忆和缓存选项是什么,它们有什么区别?


作为比较的基础,这里是我找到的选项列表。另外,在我看来,这一切都依赖于散列,所以我也会注意散列选项。键/值存储有点相关,但打开了大量关于数据库系统的蠕虫(例如 BerkeleyDB、Redis、MemcacheDB 和其他许多)。

看起来选项是:

散列

  • 摘要- 为任意 R 对象提供散列。

记忆

  • memoise - 一个非常简单的函数记忆工具。
  • R.cache - 提供了更多的记忆功能,但似乎有些功能缺少示例。

缓存

  • hash - 提供类似于 Perl 的哈希和 Python 字典的缓存功能。

键/值存储

这些是 R 对象外部存储的基本选项。

检查点

其他

  • Base R 支持:命名向量和列表、数据框的行和列名称以及环境中的项目名称。在我看来,使用列表有点笨拙。(也有pairlist,但已弃用。)
  • data.table包支持快速查找数据表的元素。

用例

尽管我最感兴趣的是了解这些选项,但出现了两个基本用例:

  1. 缓存:简单的字符串计数。[注意:这不是 NLP 的,而是通用的,所以 NLP 库是矫枉过正的;表是不够的,因为我不想等到整个字符串集加载到内存中。Perl 风格的散列在实用程序的正确级别。]
  2. 记忆可怕的计算。

这些确实出现了,因为我正在研究一些 slooooow 代码的分析,我真的很想只计算简单的字符串,看看我是否可以通过记忆来加速一些计算。能够散列输入值,即使我不记忆,也会让我看看记忆是否有帮助。


注 1:CRAN Task View on Reproducible Research列出了几个包(cacherR.cache),但没有详细说明使用选项。

注意 2:为了帮助其他人寻找相关代码,这里对一些作者或包进行了一些注释。一些作者使用 SO。:)

  • Dirk Eddelbuettel:digest- 许多其他软件包都依赖于此。
  • Roger Peng: cacher, filehash, stashR- 这些以不同的方式解决不同的问题;有关更多软件包,请参见Roger 的网站
  • Christopher Brown:hash- 似乎是一个有用的软件包,但不幸的是,与 ODG 的链接已关闭。
  • Henrik Bengtsson:R.cache& Hadley Wickham:memoise——目前还不清楚何时更喜欢一种包装。

注 3:有些人使用 memoise/memoisation 其他人使用 memoize/memoization。如果您正在四处寻找,请注意。Henrik 使用“z”,Hadley 使用“s”。

0 投票
0 回答
1554 浏览

r - TSAgg R 包错误消息:命名空间 'memoise' 不可用

我正在尝试使用 TSAgg 包在几天内汇总我的数据。但是,我收到以下错误消息:

当我加载 TSAgg 时,出现以下警告消息:警告消息:

我正在使用 R 版本 3.0.1,因为我不想使用测试版本。我能做些什么让它发挥作用吗?

0 投票
1 回答
232 浏览

r - 递归函数的备忘录

介绍

我有一个以日期为输入的函数,在一段时间内进行一些计算 - 表示为Sys.sleep()- 删除'-'日期中的所有内容并返回一个字符:

凉爽的。上面的输出是'20150114'。现在我想在这个函数中包含以前的输出。或前两天,或 ..n之前的输出,直到过去的有限天称为loopBackMaxDate

粗递归

这是一种可能的递归代码:

有了这个,我得到了和以前一样的结果(平均需要 1 秒):

以下内容需要4几秒钟的时间:

我想计算以下内容,需要 3 秒:

这非常糟糕,因为我正在再次计算 的结果vDate="2014-05-04"vDate="2014-05-03"vDate="2014-05-02"它在调用时已经完成compute("2014-05-05", loopBackMaxDate="2014-05-01", loopBackDays=1)......

记忆递归

以下是我使用 memoized 的方式:

首次运行(实际需要 4 秒):

第二次运行需要 1 秒,而我预计需要 0 秒:

我认为我在某个地方完全错了......我可以将输出存储在一个全局变量中,但我真的想让它与记忆化或连续样式传递一起工作,并避免冗余计算!

如果有人有想法,我将不胜感激!

0 投票
1 回答
534 浏览

r - 以函数为参数的函数记忆

我想在以下函数上使用R包做一些记忆memoise,将函数作为参数:

有两个连续的调用,第二个在时间上返回 1 秒,而我本可以预料到一些瞬间的事情。

这很奇怪,但是当参数是函数时它似乎memoise不适用......函数如何在内存中表示以使其工作?

0 投票
1 回答
103 浏览

r - 为什么这些记忆功能不同?

我看到如果我以两种不同的方式在函数上使用 memoise,我会得到两种不同的行为,我想了解原因。

策略 1 非常快,因为它重用了递归结果,而策略 2 只有在之前已经看到确切输入的情况下才很快。

有人可以向我解释这是为什么吗?

0 投票
1 回答
179 浏览

r - 在 R 中重建包后如何让 Memoise 缓存函数保持缓存

我使用 Memoise 包来缓存我正在开发的 R 包中的函数调用。在开发过程中,我会定期重建我的包。但是每次我这样做时,缓存的函数调用都会被遗忘。关于如何保持这些函数调用缓存的任何建议?最好使用 Memoise 包。但如果不可能,将不胜感激提供替代建议。

要从头开始复制,请执行以下操作:

第 1 部分 - 创建包

在交互式 R 控制台上,创建一个名为“TmpTestPackage1”的包。(这将在您当前的工作目录中创建一个名为“TmpTestPackage1”的目录):

创建文件 ./TmpTestPackage1/R/SomeCode.R 并插入内容:

现在在 R 控制台上(来自 TmpTestPackage1 目录的父目录,devtools 仍然可用):

第 2 部分 - 重现我的问题

0 投票
1 回答
175 浏览

r - R memoise 到具有不同匹配条件的文件系统

我想使用该memoisecache_filesystem来缓存长时间运行的函数,以便在闪亮的应用程序中使用。这几乎可以完美运行,问题在于输入是一个列表对象,其中包含一个(除其他外)会更改的数据库连接。我想在我的输入对象中忽略这个元素。

db 连接会从会话更改为会话,但我memoise只需要查看id输入中的元素,而不需要查看列表中的其他元素。有没有办法我可以做到这一点?我看过这个...论点,但这似乎只是进一步限制,而不是放松。

下面的简化示例:

编辑:我的函数的输入实际上指向一个静态数据库,因此缓存结果没有问题,指向哪个静态数据库是由id元素定义的,但是可以对同一个数据库建立不同的连接。功能可以任意复杂。例如:

0 投票
1 回答
148 浏览

r - 在 R6 对象中使用 memoise

全部,

我是R6的新手。我正在尝试创建一个通过该memoise函数缓存的私有对象。背景思想是这个对象将由计算密集型计算定义,我想避免在第一次之后重新运行。

我正在尝试复制以下行为:

您应该观察到第一个Test(1)需要一两秒钟才能运行,而第二个Test(1)是即时的。

我在 R6 世界中的 MWE 是:

这应该告诉我rnorm(1e8),但我得到了错误:

Error in private$..Z() : object 'cache' not found

快速编辑我的对象让我知道,在引擎盖下,..Z 看起来像:

所以看起来我在设置我的memoise. 看看上面的内容,我不是 100% 清楚它是如何memoise工作的——如果我看不到缓存,它是如何存在的?通常not found错误是由于范围界定造成的,使用private和会变得复杂R6

0 投票
1 回答
214 浏览

r - 如何使用 memoise::memoise 缓存并行计算的结果?

我正在预先计算结果并使用memoise包的memoise功能缓存它们。不幸的是,如果我尝试通过与 并行运行来加速计算,则不会发生记忆。parallel::mclapply

我想在每个 fork 中复制 memoised 函数然后丢弃......有没有使用其他函数或包的简单替代方法?

0 投票
0 回答
38 浏览

r - 使用 RStudio 的“转到函数”进行记忆

我经常使用 Rstudio 的“转到函数定义”(快捷键是 F2)来在许多文件之间导航并快速访问函数的定义/进行更改(打印函数的定义通常是不够的)。

为了使我的分析更快,我的许多功能都使用“memoise”包进行记忆。这一切都很好,但是当我使用“转到函数定义”按钮(或 F2)时,它会将我带到 memoise 函数。这是结果:

一个注释 - 我尝试定义函数并在它下面给出它的记忆如下: foo <- function(x) { return(x) } foo <- memoise::memoise(foo)

但是当我在 linux 上运行它时,每当我调用 foo 时,我都会得到一个无限循环。奇怪的是,它在 Windows 上运行良好(并且 F2 功能在使用这种方法的 Windows 上运行!)。我需要一些可以在 linux 系统上工作以及 F2 功能工作的东西。