【问题标题】:R memoise to filesystem with a non-identical match conditionR memoise 到具有不同匹配条件的文件系统
【发布时间】:2018-03-13 20:09:33
【问题描述】:

我想使用memoise 包和cache_filesystem 来缓存长时间运行的函数,以便在闪亮的应用程序中使用。这几乎可以完美运行,问题在于输入是一个列表对象,其中包含一个(除其他外)会更改的数据库连接。我想在我的输入对象中忽略这个元素。

数据库连接会随着会话的变化而变化,但我需要memoise 仅查看输入中的id 元素,而不查看列表中的其他元素。有没有办法我可以做到这一点?我查看了... 参数,但这似乎只是进一步限制,而不是放松。

下面的简化示例:

localCache = cache_filesystem("memoiseCache/")
input1_1 = list(id = "id1", dbConn = 100)
input1_2 = list(id = "id1", dbConn = 101)

testFun=function(input) {
  print("Running the function")
  return(100)
}
library(memoise)
testFun.mem = memoise(testFun)

# This will run the function for the initial time - CORRECT
> testFun.mem(input1_1)
[1] "Running the function"
[1] 100

# This will now fetch the cached result - CORRECT
> testFun.mem(input1_1)
[1] 100

# I need this to ignore the dbConn element and instead fetch the cached result
> testFun.mem(input1_2)
[1] "Running the function"
[1] 100

编辑:我的函数的输入实际上指向一个静态数据库,因此缓存结果没有问题, 指向的静态数据库由id 元素定义,但不同可以连接到同一个数据库。功能可以任意复杂。例如:

function(dbInputObj){
  <Many table joins and aggregations>
  <Some logic and conditions>
  <More table joins>
  return(result)
}

【问题讨论】:

    标签: r memoization memoise


    【解决方案1】:

    您可以编写一个包装函数来隐藏差异。不过,我无法从简化的代码中看到您的应用程序是如何工作的。

    您是否使用不同的dbConn 连接到同一个数据库?您是在尝试缓存数据库查询还是数据库查询后的某些计算?

    如果dbConn 可以不同,我认为缓存数据库查询不是一个好主意。您应该从数据库中获取更新的数据,而不是缓存它。

    如果要在查询数据库后缓存计算,只需先获取值,然后只用值记住计算函数,而不是数据库连接。

    【讨论】:

    • 感谢您的回复 - 我已经用更多信息编辑了这个问题。由于我想让函数任意复杂,我想不出一种方法来做到这一点,而不仅仅是从memoise“隐藏”输入列表的一些元素——这可能是不可能的?
    • 我仍然认为在数据库端缓存更合乎逻辑,尽管你可以使用一个简单的技巧(在概念上并不推荐):获取 dbConn 作为变量,编写一个以 dbConn 作为全局变量的函数而不是参数。这打破了memoise 的多个假设,但可能适用于您的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多