2010-12-30 2 views
3

많은 레코드를 클로저 해시 테이블에 저장하려고합니다. 특정 필드 나 범위 쿼리를 사용하여 특정 레코드에 빠르게 액세스하려는 경우 데이터베이스에 데이터를 저장하지 않고도 어떤 옵션을 사용할 수 있습니까 (첫 번째 위치에서 데이터를 가져온 위치).clojure 해시 테이블에서 빠른 액세스를위한 인덱스를 만들려면 어떻게해야합니까?

STM이 대형 인덱스 데이터 세트에도 적합한 지 궁금합니다.

답변

2

범위 쿼리를 수행 할 수 있도록 sorted-map을 사용하여 각 필드에 대해 별도의 인덱스를 만들고 싶을 것입니다. 내부적으로 이것은 Java TreeMap의 영구 버전과 같은 것을 사용합니다.

주로 읽기 액세스에 관심이있는 경우 STM을 사용해서는 안됩니다.

  • 당신은 같은 시간에 데이터와 인덱스의 일관된 스냅 샷을 만들 수 있습니다 잠금 어떤을 필요로하지 않는 읽습니다

    • : 사실조차 이후 변경 가능한 테이블보다 더 증명할 수 있습니다.
  • 5

    얼마나 멀리 밀고 싶은지에 따라 메모리 내장 데이터베이스를 작성해야합니다. 나는 당신이 실제로 그것을하고 싶지 않거나 이미 존재하는 많은 메모리상의 자바 데이터베이스 (Derby, H2, 등) 중 하나를 사용하고 있다고 가정합니다.

    데이터의 여러 속성에 대한 색인화 된 또는 범위 액세스를 원할 경우 Clojure 데이터 구조에 모든 색인을 작성해야합니다. Clojure 맵은 O (log32 n) 시간 동안 데이터에 액세스 할 수있게합니다 (상수보다 나쁘지 만 여전히 매우 제한적 임). 이보다 더 나은 기능이 필요한 경우 HashMap 또는 ConcurrentHashMap과 같은 Java 맵을 Clojure 데이터 모델 외부에있는 경고와 직접 사용할 수 있습니다. 범위 접근을 위해 정렬 된 트리 데이터 구조를 원할 것입니다 ... Java는 ConcurentSkipListMap을 가지고 있습니다. 그게 충분하지 않다면, 당신은 자신의 btree impl이 필요할지도 모른다.

    이 데이터를 변경하지 않으면 Clojure의 STM은 중요하지 않습니다. 이 데이터가 데이터베이스 하위 집합의 캐시로 취급됩니까? 그렇다면 Ehcache과 같은 캐시 라이브러리를 사용하는 것이 좋습니다. 최근에는 매우 큰 오프 힙 캐시 및 검색 기능에 대한 지원이 추가되었습니다.

    메모리 내 캐시와 영구 저장소 간의 데이터 균형 조정은 까다로운 비즈니스이며 데이터가 많은 앱에서 올바르게 작동하려면 가장 중요한 사항 중 하나입니다.

    +0

    Clojure STM이 모든 데이터를 보유 할 계획이었습니다. – Zubair

    +0

    H2 또는 다른 데이터베이스를 사용하고 싶지만 모든 클로저 기능이 추가 기능처럼 작동하는 것은 아닙니다. – Zubair

    +0

    Clojure의 STM은 모든 데이터를 "보유"하지 않고 상태 변경을 조정합니다. 어떤 의미인지는 모르지만 이상하게 들릴 것입니다. :) –

    관련 문제