2017-03-16 9 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'sを変更するのに気にしないで、javaの' Set'オペレーション( 'difference'のための' removeAll'、unionのための 'addAll'など)を使うのが最良です。 2つの10e6要素の 'HashSet'には、結果の差が5e6で、' clojure.set/difference'を使って6秒、javaの 'removeAll'を使って約1秒です。 – Josh

答えて

1

返される値が実装の詳細であるjava.util.Set(データ型documentation、戻り値の型はjava.util.Collection)に依存することはお勧めしません。

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)'のパフォーマンスを参照しています。しかし、あなたが正しいと思うのは、そのうちの1つが小さくてもいいということです。 – m33lky

関連する問題