如何使用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 秒。
有什么想法吗?
答案 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类型的输入),我对备忘录有类似的问题。大概我会说备忘录是根据与功能输入有关的键存储功能结果的,而问题出在键生成算法上。这个问题是:
这两种方法都意味着您要在每个函数调用上重新计算/重新处理。这当然符合我所目睹的情况。 function(string)可以很好地缓存,而function(data.table,string)则不能。
答案 2 :(得分:1)
您的代码的瓶颈是什么?
我认为缓存数据库查询并不是一个好主意,但根据定义,如果DB更新,您可以获得具有完全相同的DB名称和相同查询的不同结果。缓存是不安全的。
数据库本身可能有一些缓存机制来加速重复查询。