2017-03-16 2 views
1

Datomic 쿼리는 호환성을 위해 java.util.HashSet을 반환합니다. 나는 쿼리 결과 집합에 차이를 설정 같은 clojure.set 기능을 사용하고 싶습니다. 현재, 나는 결과 세트를 (set datomic_result)을 사용하여 Clojure로 변환 중입니다. 이것에 대한 대안이 있습니까?java.util.HashSet을 Clojure로 변환하는 가장 좋은 방법

+1

'(set datomic_result) 접근 방식의 문제점은 무엇입니까? – OlegTheCat

+0

이것은 지금 나에게 어울립니다. 결과 집합은 잠재적으로 커질 수 있으며이 문제와 관련된 오버 헤드가 있다고 생각합니다. – m33lky

+1

불변성을 유지하면서 결과 집합에 대해 여러 작업을 수행해야합니까? 그렇지 않다면 반환 된'HashSet'을 수정하는 데 신경 쓰지 마세요. java의'Set' 연산을 사용하는 것이 가장 좋습니다 ('difference'에 대해서는'removeAll', union에는'addAll' 등). 차이가 5e6 인 두 개의 10e6 요소'HashSet'에 대해'clojure.set/difference'를 사용하여 계산하는 데 6 초가 걸리고 java의'removeAll'을 사용하여 약 1 초가 걸립니다. – Josh

답변

1

리턴 값이 java.util.Set이라는 구현 세부 사항 (데이터 유형 documentation에 따라 반환 유형은 java.util.Collection)에 의존하지 않는 것이 좋습니다.

집합에 강제 적용하는 대신 반환 된 모음에 직접 설정 작업을 적용하면 성능이 향상 될 수 있습니다. 예를 들어 :

;; set difference 
(into #{} (remove to-remove) query-result) 
;; set intersection 
(into #{} (filter to-keep) query-result) 
;; set union 
(into my-set query-result) 

into의 사용은 당신에게 큰 입력에 상당한 성능 향상을 제공 할 수 있습니다 TransientsTransducers을 모두 활용할 수 있습니다.

+0

제거가 효율적 이도록 세트가 필요하지 않습니까? – m33lky

+0

오른쪽 세트가 작 으면 전체 스캔보다 빠릅니다. –

+0

집합 대 집합을 사용할 때'O (n^2)'와'O (n)'의 성능을 언급하고 있습니다. 그러나 그 중 하나가 작을 수 있다는 점을 고려해야한다는 것이 옳습니다. – m33lky