【发布时间】:2011-11-07 21:58:01
【问题描述】:
我试图找到一种简单的方法来在 R 中使用类似 Perl 的散列函数(本质上是缓存),因为我打算同时进行 Perl 风格的散列并编写我自己的计算记忆。然而,其他人已经打败了我,并且有用于记忆的包。我挖掘的越多,我发现的越多,例如memoise 和R.cache,但它们之间的区别还不是很清楚。此外,除了使用 hash 包之外,还不清楚如何获得 Perl 风格的哈希(或 Python 风格的字典)并编写自己的 memoization,这似乎并不支持这两个 memoization 包。
由于我找不到关于 CRAN 或其他地方的信息来区分选项,也许这应该是关于 SO 的社区 wiki 问题:R 中的记忆和缓存选项有哪些,它们有什么区别?
作为比较的基础,这里列出了我找到的选项。另外,在我看来,这一切都依赖于散列,所以我也会注意散列选项。键/值存储有些相关,但会引发大量有关数据库系统(例如 BerkeleyDB、Redis、MemcacheDB 和scores of others)的蠕虫。
看起来选项是:
散列
- digest - 为任意 R 对象提供散列。
记忆
缓存
- hash - 提供类似于 Perl 的哈希和 Python 字典的缓存功能。
键/值存储
这些是 R 对象外部存储的基本选项。
检查点
- cacher - 这似乎更类似于 checkpointing。
-
CodeDepends - 一个支持
cacher并提供一些有用功能的 OmegaHat 项目。 - DMTCP(不是 R 包)- 似乎支持多种语言的检查点,a developer recently sought assistance testing DMTCP checkpointing in R。
其他
- Base R 支持:命名向量和列表、数据框的行和列名称以及环境中的项目名称。在我看来,使用列表有点笨拙。 (还有
pairlist,但it is deprecated。) - data.table 包支持快速查找数据表中的元素。
用例
虽然我最感兴趣的是了解这些选项,但我有两个基本用例:
- 缓存:简单的字符串计数。 [注意:这不是 NLP 的,而是通用的,所以 NLP 库是矫枉过正的;表是不够的,因为我不想等到整个字符串集加载到内存中。 Perl 风格的散列在实用程序的正确级别。]
- 巨大的计算记忆。
这些确实出现了,因为我是digging in to the profiling of some slooooow code,我真的很想计算简单的字符串,看看我是否可以通过记忆加快一些计算。能够对输入值进行哈希处理,即使我不记忆,也会让我看看记忆是否有帮助。
注意 1:CRAN Task View on Reproducible Research 列出了几个包(cacher 和 R.cache),但没有详细说明使用选项。
注 2:为了帮助其他人寻找相关代码,这里对一些作者或包进行了一些注解。一些作者使用 SO。 :)
- Dirk Eddelbuettel:
digest- 许多其他软件包都依赖于此。 - Roger Peng:
cacher、filehash、stashR- 这些以不同的方式解决不同的问题;更多软件包请参见Roger's site。 - Christopher Brown:
hash- 似乎是一个有用的软件包,但不幸的是,ODG 的链接已关闭。 - Henrik Bengtsson:
R.cache和 Hadley Wickham:memoise-- 目前尚不清楚何时更喜欢一个包。
注意 3:有些人使用 memoise/memoisation 其他人使用 memoize/memoization。如果您正在四处寻找,请注意。 Henrik 使用“z”,Hadley 使用“s”。
【问题讨论】:
-
添加一个或两个真实用例可能会更好,以便比较方法......
-
@Tommy:谢谢,我会的!
-
对您的 cmets re: 环境感到困惑。如果您创建一个新环境,它将被散列。
?environment例如,env.profile(new.env())$size# [1] 29 -
@DWin:你是对的。我只提到它作为哈希功能的一个选项。
-
这篇文章由“R in a Nutshell”的作者撰写,包括对查找对象的几种不同选项的速度测试,包括将它们置于环境中(查找使用散列名称)broadcast.oreilly.com/2010/03/lookup-performance-in-r.html。不知道它是否对你有用,但我想我会将它附加到这篇文章中,以供其他人使用。
标签: r caching hash memoization memoise