闪亮的应用程序 - 使用 memoise 缓存 R 值

Shiny app - Using memoise to cache R values

如何使用备忘录缓存我的查询数据结果?

我已经用我的数据试过了,完全没有区别。

这是我的功能,

runQuery <- function(DB, query, site) {

    # Match the pattern and replace it.
    dataQuery <- sub("SITE", as.character(site), query)

    # Store the result in data1.
    data = dbGetQuery(DB, dataQuery)

    return(data)
}

memoise_data <- memoise(runQuery)

data1 <- memoise_data(DB, dataQuery, site1)

无论有无memoise.

剧情仍需要21.61824

有什么想法吗?

您只会在记忆函数的第二次和后续调用中获得加速。在第一次调用时,它运行 'wrapped' 函数并缓存其输出。您应该注意到第二次调用 memoise_data() 时的区别。

例如:

f <- function() { 
  a <- rnorm(1e5)
  5 
} 
system.time(f())
user  system elapsed 
0.05    0.00    0.05 
mf <- memoise::memoise(f)
system.time(mf())
user  system elapsed 
0.05    0.00    0.05 
system.time(mf())
user  system elapsed 
0       0       0 

你的代码有什么瓶颈?

  • 是数据库查询本身吗?
  • 是收发的时间吗?

我认为缓存数据库查询不是个好主意,根据定义,如果数据库更新,您可能会得到完全相同的数据库名称和相同查询的不同结果。这对缓存不安全。

数据库本身可能有一些缓存机制来加速重复查询。

为了缓存函数包含 data.table 类型输入的计算结果,我在使用 memoise 时遇到了类似的问题。我猜测我会说 memoise 正在根据与函数输入相关的密钥存储函数结果,而问题出在密钥生成算法上。该问题是:

  1. 无法从某些输入类型形成键,因此永远不会缓存结果,或者
  2. 密钥算法在每次调用时创建不同的密钥。

其中任何一个都意味着您在每个函数调用中都是 recalculating/reprocessing。这当然符合我所目睹的情况。 function(string) 可以很好地缓存,而 function(data.table, string) 则不能。