闪亮的应用程序 - 使用备忘录缓存R值

时间:2015-07-18 10:48:22

标签: r shiny

如何使用memoise缓存查询数据结果?

我已经尝试过我的数据,它没有任何区别。

这是我的功能,

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 秒。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您只能在memoized函数的第二次和后续调用中获得加速。在第一次调用时,它会运行&#39; wrapped&#39;函数并缓存其输出。您应该注意到第二次拨打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 

答案 1 :(得分:2)

为了存储计算结果(该函数包含data.table类型的输入),我对备忘录有类似的问题。大概我会说备忘录是根据与功能输入有关的键存储功能结果的,而问题出在键生成算法上。这个问题是:

  1. 不能由某些输入类型形成键,因此永远不会缓存结果,或者
  2. 密钥算法正在为每个呼叫创建一个可变密钥。

这两种方法都意味着您要在每个函数调用上重新计算/重新处理。这当然符合我所目睹的情况。 function(string)可以很好地缓存,而function(data.table,string)则不能。

答案 2 :(得分:1)

您的代码的瓶颈是什么?

  • 是数据库查询本身吗?
  • 这是花在发送和接收上的时间吗?

我认为缓存数据库查询并不是一个好主意,但根据定义,如果DB更新,您可以获得具有完全相同的DB名称和相同查询的不同结果。缓存是不安全的。

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