2014-05-20 2 views
2

우리는 Voyage를 사용하여 많은 데이터를 MongoDB에 저장합니다.Pharo에서 Voyage에서 캐싱을 사용하지 않도록 설정하는 방법은 무엇입니까?

현재 문제는 Voyage가 DB에 저장된 모든 개체를 캐싱한다는 것입니다. 그리고 캐시가 최대 크기에 가까워지면 캐시 속도가 매우 느려집니다.

주요 목적은 최적화가 아니라 ( 들이 동일해야하는 경우) 복제 된 개체를 방지 :

물론, 우리는 단지 캐시의 최대 크기를 늘릴 수 있지만 VOMongoCache의 클래스 설명을 말한다

생성 된 새 개체 만 저장하기 때문에 이러한 캐시가 필요하지 않습니다.

그래서 캐싱을 완전히 비활성화하고 싶습니다. 현재 우리는 단지 캐싱을 사용하지 않도록이 해결 방법을 사용 : 우리는 단지 캐시에 개체를 추가하는 부분을 주석

VOMongoCache>> 
at: anOID put: anObject 
    self compactIfNeeded. 
    self mutex 
     critical: [ "objects at: anOID put: anObject" ]. 

합니다.

캐싱을 완전히 비활성화하는 더 나은 해결책이 있습니까?

미리 감사드립니다.

답변

2

Voyage는 객체 그래프 직렬화 기입니다. 그러므로 캐시가 절대적으로 필요합니다. 디자인을 만들 때 고려한 유스 케이스 중 유스 케이스는별로 중요하지 않습니다. 당신은 단지 객체를 작성하고 있지만 serializer의 관점에서 언제든지 읽을 수 있고 올바른 것이어야합니다.

어쨌든. 어쩌면 응용 프로그램을 미세 조정하는 데 도움이 될 수 있습니다. Voyage가하는 일은 모든 활성 객체가 캐시에 보관된다는 것입니다. 활성 상태라면 현재 모든 처리 코드에서 객체에 대한 참조가 있음을 의미합니다. 객체가 더 이상 활성화되지 않으면 가비지 수집기가 객체를 제거하고 동시에 캐시에서 nil'ed됩니다. 캐시가 너무 커지면 압축으로 인해 새로운 객체를위한 공간을 만드는 모든 nil'ed 항목이 제거됩니다. 캐시하는 것보다 직렬화하는 모든 개체에 대한 참조를 유지하는 하나의 메서드를 실행하는 경우에는 압축되지만 빈 슬롯은 제외됩니다. 그래서 압축은 모든 단계를 느리게 만드는 다음 단계에서 다시 시도됩니다.

당신이 할 수있는 일은 당신이 가지고있는 객체 (작성해야만하는 것들)를 몇개 가지고 직렬화하고 범위를 벗어나서 청소 과정이 그들을 관리 할 수 ​​있도록해야한다는 것입니다. 둘째 나는

VORepository current cache compactLimit: aNumber 

컴팩이 적게 병렬로 문제를 해결하기 위해 코드와 GC 더 많은 시간을주고 실행이 방법을 사용하여 캐시에 compactLimit을 확장 할 것입니다.