闪亮的应用程序 - 使用 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 正在根据与函数输入相关的密钥存储函数结果,而问题出在密钥生成算法上。该问题是:
- 无法从某些输入类型形成键,因此永远不会缓存结果,或者
- 密钥算法在每次调用时创建不同的密钥。
其中任何一个都意味着您在每个函数调用中都是 recalculating/reprocessing。这当然符合我所目睹的情况。 function(string) 可以很好地缓存,而 function(data.table, string) 则不能。
如何使用备忘录缓存我的查询数据结果?
我已经用我的数据试过了,完全没有区别。
这是我的功能,
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
.
有什么想法吗?
您只会在记忆函数的第二次和后续调用中获得加速。在第一次调用时,它运行 '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 正在根据与函数输入相关的密钥存储函数结果,而问题出在密钥生成算法上。该问题是:
- 无法从某些输入类型形成键,因此永远不会缓存结果,或者
- 密钥算法在每次调用时创建不同的密钥。
其中任何一个都意味着您在每个函数调用中都是 recalculating/reprocessing。这当然符合我所目睹的情况。 function(string) 可以很好地缓存,而 function(data.table, string) 则不能。