R памятка для файловой системы с неидентичным условием соответствия
Я хотел бы использовать 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)
}
1 ответ
Вы можете написать функцию-обертку, чтобы скрыть различия. Я не могу видеть, как ваше приложение работает из упрощенного кода, хотя.
Вы подключаетесь к одной базе данных с разными dbConn
? Вы пытаетесь кэшировать запрос базы данных или какой-либо расчет после запроса базы данных?
Я не думаю, что это хорошая идея, чтобы кэшировать запрос базы данных, если dbConn
может быть другим. Вы должны получать обновленные данные из базы данных, а не кэшировать их.
Если вы хотите кэшировать вычисления после запроса к базе данных, просто сначала получите значение, а затем запомните функцию расчета только со значениями, а не с подключением к базе данных.