问题标签 [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.
r - R中的缓存/记忆/散列选项
我试图找到一种简单的方法来在 R 中使用类似 Perl 的散列函数(本质上是缓存),因为我打算同时进行 Perl 风格的散列并编写我自己的计算记忆。然而,其他人已经打败了我,并且有用于记忆的包。我挖掘的越多,我发现的越多,例如memoise
和R.cache
,但区别并不容易清楚。hash
此外,除了使用似乎不支持这两个 memoization 包的包之外,还不清楚如何获得 Perl 样式的哈希(或 Python 样式的字典)并编写自己的 memoization 。
由于我找不到关于 CRAN 或其他地方的信息来区分这些选项,也许这应该是关于 SO 的社区 wiki 问题:R 中的记忆和缓存选项是什么,它们有什么区别?
作为比较的基础,这里是我找到的选项列表。另外,在我看来,这一切都依赖于散列,所以我也会注意散列选项。键/值存储有点相关,但打开了大量关于数据库系统的蠕虫(例如 BerkeleyDB、Redis、MemcacheDB 和其他许多)。
看起来选项是:
散列
- 摘要- 为任意 R 对象提供散列。
记忆
缓存
- hash - 提供类似于 Perl 的哈希和 Python 字典的缓存功能。
键/值存储
这些是 R 对象外部存储的基本选项。
检查点
- cacher - 这似乎更类似于检查点。
- CodeDepends - 一个 OmegaHat 项目,支持
cacher
并提供一些有用的功能。 - DMTCP(不是 R 包)- 似乎支持多种语言的检查点,开发人员最近寻求帮助测试 R 中的 DMTCP 检查点。
其他
用例
尽管我最感兴趣的是了解这些选项,但出现了两个基本用例:
- 缓存:简单的字符串计数。[注意:这不是 NLP 的,而是通用的,所以 NLP 库是矫枉过正的;表是不够的,因为我不想等到整个字符串集加载到内存中。Perl 风格的散列在实用程序的正确级别。]
- 记忆可怕的计算。
这些确实出现了,因为我正在研究一些 slooooow 代码的分析,我真的很想只计算简单的字符串,看看我是否可以通过记忆来加速一些计算。能够散列输入值,即使我不记忆,也会让我看看记忆是否有帮助。
注 1:CRAN Task View on Reproducible Research列出了几个包(cacher
和R.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”。
r - TSAgg R 包错误消息:命名空间 'memoise' 不可用
我正在尝试使用 TSAgg 包在几天内汇总我的数据。但是,我收到以下错误消息:
当我加载 TSAgg 时,出现以下警告消息:警告消息:
我正在使用 R 版本 3.0.1,因为我不想使用测试版本。我能做些什么让它发挥作用吗?
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 秒:
我认为我在某个地方完全错了......我可以将输出存储在一个全局变量中,但我真的想让它与记忆化或连续样式传递一起工作,并避免冗余计算!
如果有人有想法,我将不胜感激!
r - 以函数为参数的函数记忆
我想在以下函数上使用R
包做一些记忆memoise
,将函数作为参数:
有两个连续的调用,第二个在时间上返回 1 秒,而我本可以预料到一些瞬间的事情。
这很奇怪,但是当参数是函数时它似乎memoise
不适用......函数如何在内存中表示以使其工作?
r - 为什么这些记忆功能不同?
我看到如果我以两种不同的方式在函数上使用 memoise,我会得到两种不同的行为,我想了解原因。
策略 1 非常快,因为它重用了递归结果,而策略 2 只有在之前已经看到确切输入的情况下才很快。
有人可以向我解释这是为什么吗?
r - 在 R 中重建包后如何让 Memoise 缓存函数保持缓存
我使用 Memoise 包来缓存我正在开发的 R 包中的函数调用。在开发过程中,我会定期重建我的包。但是每次我这样做时,缓存的函数调用都会被遗忘。关于如何保持这些函数调用缓存的任何建议?最好使用 Memoise 包。但如果不可能,将不胜感激提供替代建议。
要从头开始复制,请执行以下操作:
第 1 部分 - 创建包
在交互式 R 控制台上,创建一个名为“TmpTestPackage1”的包。(这将在您当前的工作目录中创建一个名为“TmpTestPackage1”的目录):
创建文件 ./TmpTestPackage1/R/SomeCode.R 并插入内容:
现在在 R 控制台上(来自 TmpTestPackage1 目录的父目录,devtools 仍然可用):
第 2 部分 - 重现我的问题
r - R memoise 到具有不同匹配条件的文件系统
我想使用该memoise
包cache_filesystem
来缓存长时间运行的函数,以便在闪亮的应用程序中使用。这几乎可以完美运行,问题在于输入是一个列表对象,其中包含一个(除其他外)会更改的数据库连接。我想在我的输入对象中忽略这个元素。
db 连接会从会话更改为会话,但我memoise
只需要查看id
输入中的元素,而不需要查看列表中的其他元素。有没有办法我可以做到这一点?我看过这个...
论点,但这似乎只是进一步限制,而不是放松。
下面的简化示例:
编辑:我的函数的输入实际上指向一个静态数据库,因此缓存结果没有问题,指向哪个静态数据库是由id
元素定义的,但是可以对同一个数据库建立不同的连接。功能可以任意复杂。例如:
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
。
r - 如何使用 memoise::memoise 缓存并行计算的结果?
我正在预先计算结果并使用memoise包的memoise
功能缓存它们。不幸的是,如果我尝试通过与 并行运行来加速计算,则不会发生记忆。parallel::mclapply
我想在每个 fork 中复制 memoised 函数然后丢弃......有没有使用其他函数或包的简单替代方法?
r - 使用 RStudio 的“转到函数”进行记忆
我经常使用 Rstudio 的“转到函数定义”(快捷键是 F2)来在许多文件之间导航并快速访问函数的定义/进行更改(打印函数的定义通常是不够的)。
为了使我的分析更快,我的许多功能都使用“memoise”包进行记忆。这一切都很好,但是当我使用“转到函数定义”按钮(或 F2)时,它会将我带到 memoise 函数。这是结果:
一个注释 - 我尝试定义函数并在它下面给出它的记忆如下: foo <- function(x) { return(x) } foo <- memoise::memoise(foo)
但是当我在 linux 上运行它时,每当我调用 foo 时,我都会得到一个无限循环。奇怪的是,它在 Windows 上运行良好(并且 F2 功能在使用这种方法的 Windows 上运行!)。我需要一些可以在 linux 系统上工作以及 F2 功能工作的东西。