2017-10-02 11 views
0

cache_filesystem과 함께 memoise 패키지를 사용하여 반짝이는 응용 프로그램에서 사용할 수 있도록 장기간 실행되는 기능을 저장하고 싶습니다. 이것은 거의 완벽하게 작동합니다. 문제는 입력이 변경 될 DB 연결 (다른 것들 중에서)을 포함하는 목록 객체라는 것입니다. 내 입력 개체에서이 요소를 무시하고 싶습니다.일치하지 않는 파일 시스템에 대해 메모하십시오.

db 연결은 세션마다 변경되지만 입력의 id 요소 만보고 목록의 다른 요소는 볼 수 없으므로 memoise이 필요합니다. 내가 할 수있는 방법이 있니? 나는 ... 논쟁을 보았습니다. 그러나 이것은 더 이상 제한하지 않는 것처럼 보입니다.

아래

간단한 예 :

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 

편집 : 정적 DB 그렇게 정적 DB가에 의해 정의된다 가리키는 결과, 를 캐시에 문제가 없는지에 내 함수의 입력은 실제로 점 id 요소가 있지만 동일한 DB에 다른 연결을 설정할 수 있습니다. 기능은 임의로 복잡 할 수 있습니다. 예 :

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

답변

0

차이점을 숨기려면 래퍼 기능을 작성할 수 있습니다. 간단한 코드로 앱이 어떻게 작동하는지 알 수 없습니다.

dbConn이 서로 다른 동일한 데이터베이스에 연결하고 있습니까? 데이터베이스 질의 후 데이터베이스 조회 또는 일부 계산을 캐시하려고합니까?

dbConn이 다를 수있는 경우 데이터베이스 쿼리를 캐싱하는 것이 좋습니다. 캐싱하지 않고 데이터베이스에서 업데이트 된 데이터를 가져와야합니다.

데이터베이스 조회 후 계산을 캐시하려면 값을 먼저 가져온 다음 데이터베이스 연결이 아닌 값만 사용하여 계산 함수를 메모하십시오.

+0

응답 해 주셔서 감사합니다. - 자세한 내용으로 질문을 수정했습니다. 함수를 임의적으로 복잡하게 만들고 싶기 때문에 필자는 입력리스트의 일부 요소를'memoise '에서 숨기지 않고서는 이것을 할 수있는 방법을 생각할 수 없다. –

+0

간단한 해킹 (개념적으로는 권장하지 않음)을 사용할 수 있지만 데이터베이스 끝에서 캐시하는 것이 더 논리적이라고 생각합니다. dbConn을 변수로 가져오고 dbConn을 매개 변수 대신 전역 변수로 사용하는 함수를 작성합니다. 이것은'memoise'의 여러 가정을 깨뜨리지 만 여러분의 경우에는 효과가있을 수 있습니다. – dracodoc