2017-03-16 69 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'操作('removeAll'用於'差異','addAll'用於聯合等)。對於兩個10e6元素'HashSet',在結果差異中有5e6,使用'clojure.set/difference'計算需要6秒的時間差,而使用java的'removeAll'則需要大約1秒。 – Josh

回答

1

我不建議您依賴返回值爲java.util.Set這一實現細節(根據Datomic documentation,返回類型爲java.util.Collection)的事實。

將您的set操作直接應用於返回的集合而不是強制轉換爲Set,您可能會獲得更好的性能。例如:

;; 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

相關問題