R:环境的缓存/内存

标签 r oop caching memoization proto

n我想使用memoization缓存某些昂贵操作的结果,这样就不会一遍又一遍地计算它们。

两个memoiseR.cache适合我的需要。但是,我发现缓存在调用之间并不可靠。

这是一个演示我看到的问题的示例:

library(memoise)

# Memoisation works: b() is called only once
a <- function(x) runif(1)
replicate(5, a())
b <- memoise(a)
replicate(5, b())

# Memoisation fails: mfn() is called every single time
ProtoTester <- proto(
  calc = function(.) {
    fn <- function() print(runif(1))
    mfn <- memoise(fn)
    invisible(mfn())
  }      
)
replicate(5, ProtoTester$calc())

根据答案更新

根据使用的是持久缓存还是非持久缓存,这个问题可能会有不同的答案。非持久缓存(例如 memoise )可能需要单个分配,然后下面的答案是一个不错的方法。持久缓存(例如 R.cache )跨 session 工作,并且对于多个分配应该是健壮的。上述方法适用于 R.cache .尽管有多项任务,fn仅使用 R.cache 调用一次.它会被 memoise 调用两次.
> ProtoTester <- proto(
+     calc = function(.) {
+         fn <- function() print(runif(1))
+         invisible(memoizedCall(fn))
+     }      
+ )
> replicate(5, ProtoTester$calc())
[1] 0.977563
[1] 0.1279641
[1] 0.01358866
[1] 0.9993092
[1] 0.3114813
[1] 0.97756303 0.12796408 0.01358866 0.99930922 0.31148128
> ProtoTester <- proto(
+     calc = function(.) {
+         fn <- function() print(runif(1))
+         invisible(memoizedCall(fn))
+     }      
+ )
> replicate(5, ProtoTester$calc())
[1] 0.97756303 0.12796408 0.01358866 0.99930922 0.31148128

我认为 R.cache 有问题的原因是我通过了proto方法作为 memoizedCall 的函数. proto方法以 R.cache 的方式绑定(bind)到环境。很难相处。在这种情况下,您需要做的是取消绑定(bind)函数(从实例化方法获取简单函数),然后手动将对象作为第一个参数传递。以下示例显示了它是如何工作的(ReportReport$loader 都是 proto 对象:
# This will not memoize the call
memoizedCall(Report$loader$download_report)

# This works as intended
memoizedCall(with(Report$loader, download_report), Report$loader)

我很想知道为什么R.cache适用于绑定(bind)到环境的正常功能,但因 proto 而失败实例化的方法。

最佳答案

在您的代码中,每次调用该函数时都会重新对其进行内存。
以下应该有效:它只在定义时被内存一次。

ProtoTester <- proto(
  calc = {
    fn <- function() print(runif(1))
    mfn <- memoise(fn)
    function(.) mfn()
  }
)
replicate(5, ProtoTester$calc())

关于R:环境的缓存/内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11357602/

相关文章:

c# - 如何确定哪个继承类正在使用抽象类的方法

sql - 当对DBI进行子类化时,Perl DBI将设置SQLite DB cache_size视为写操作

Java - 连续并行流之间的缓存一致性?

r - 在 rstan 中,通过列表指定的初始参数值是应用于约束支撑还是无约束支撑?

c++ - 这是使用 C++ 锁定容器的可接受方法吗?

c# - 函数/方法的合适名称

asp.net - HttpContext 的 Cache 和 Items 属性有什么区别?

R 加载错误 - libproj.so.13 : cannot open shared object file: No such file or directory

r - 如何一次从多面图保存/生成多个单个图?

r - Str_detect 多列使用跨