我试图找到一种简单的方法来在 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”。