많은 레코드를 클로저 해시 테이블에 저장하려고합니다. 특정 필드 나 범위 쿼리를 사용하여 특정 레코드에 빠르게 액세스하려는 경우 데이터베이스에 데이터를 저장하지 않고도 어떤 옵션을 사용할 수 있습니까 (첫 번째 위치에서 데이터를 가져온 위치).clojure 해시 테이블에서 빠른 액세스를위한 인덱스를 만들려면 어떻게해야합니까?
STM이 대형 인덱스 데이터 세트에도 적합한 지 궁금합니다.
많은 레코드를 클로저 해시 테이블에 저장하려고합니다. 특정 필드 나 범위 쿼리를 사용하여 특정 레코드에 빠르게 액세스하려는 경우 데이터베이스에 데이터를 저장하지 않고도 어떤 옵션을 사용할 수 있습니까 (첫 번째 위치에서 데이터를 가져온 위치).clojure 해시 테이블에서 빠른 액세스를위한 인덱스를 만들려면 어떻게해야합니까?
STM이 대형 인덱스 데이터 세트에도 적합한 지 궁금합니다.
범위 쿼리를 수행 할 수 있도록 sorted-map을 사용하여 각 필드에 대해 별도의 인덱스를 만들고 싶을 것입니다. 내부적으로 이것은 Java TreeMap의 영구 버전과 같은 것을 사용합니다.
주로 읽기 액세스에 관심이있는 경우 STM을 사용해서는 안됩니다.
얼마나 멀리 밀고 싶은지에 따라 메모리 내장 데이터베이스를 작성해야합니다. 나는 당신이 실제로 그것을하고 싶지 않거나 이미 존재하는 많은 메모리상의 자바 데이터베이스 (Derby, H2, 등) 중 하나를 사용하고 있다고 가정합니다.
데이터의 여러 속성에 대한 색인화 된 또는 범위 액세스를 원할 경우 Clojure 데이터 구조에 모든 색인을 작성해야합니다. Clojure 맵은 O (log32 n) 시간 동안 데이터에 액세스 할 수있게합니다 (상수보다 나쁘지 만 여전히 매우 제한적 임). 이보다 더 나은 기능이 필요한 경우 HashMap 또는 ConcurrentHashMap과 같은 Java 맵을 Clojure 데이터 모델 외부에있는 경고와 직접 사용할 수 있습니다. 범위 접근을 위해 정렬 된 트리 데이터 구조를 원할 것입니다 ... Java는 ConcurentSkipListMap을 가지고 있습니다. 그게 충분하지 않다면, 당신은 자신의 btree impl이 필요할지도 모른다.
이 데이터를 변경하지 않으면 Clojure의 STM은 중요하지 않습니다. 이 데이터가 데이터베이스 하위 집합의 캐시로 취급됩니까? 그렇다면 Ehcache과 같은 캐시 라이브러리를 사용하는 것이 좋습니다. 최근에는 매우 큰 오프 힙 캐시 및 검색 기능에 대한 지원이 추가되었습니다.
메모리 내 캐시와 영구 저장소 간의 데이터 균형 조정은 까다로운 비즈니스이며 데이터가 많은 앱에서 올바르게 작동하려면 가장 중요한 사항 중 하나입니다.
Clojure STM이 모든 데이터를 보유 할 계획이었습니다. – Zubair
H2 또는 다른 데이터베이스를 사용하고 싶지만 모든 클로저 기능이 추가 기능처럼 작동하는 것은 아닙니다. – Zubair
Clojure의 STM은 모든 데이터를 "보유"하지 않고 상태 변경을 조정합니다. 어떤 의미인지는 모르지만 이상하게 들릴 것입니다. :) –