6

Javaでは、オブジェクトの大きなコレクション(〜10,000オブジェクト)がありますSet<Person> cityInhabitants. また、これらの述語のいずれかに一致するものを除外するために使用される述語の大きなコレクション(1,000 述語)もあります。述語は、たとえばPerson

  • person.getName().equals("ugly name1")
  • person.getName().equals("ugly name2")
  • person.getAge() < 18.

この要件には、次の課題が必要です。

  • フィルタリングは高速でなければならない
  • 述語は「ビジネス定義」であるため、述語を簡単に追加および削除できます。つまり、述語はおそらくソース コードでハードコーディングするべきではなく、データベースで維持する方がよい (?)

これらの課題に対する解決策は何ですか? ここで役立つライブラリはありますか?

4

4 に答える 4

2

この状況では、操作自体の複雑さに関連してできることはあまりありません。エントリが多く、述語が多く、述語が高価な場合、できるだけ高速になるように最適化できますが、ここでの単一の操作が高価になる可能性があるため、特定のしきい値を確実に超えることはありません。

さまざまなアプローチをテストし、特定の状況でより優れたパフォーマンスを発揮するものを確認する必要があります。

  • 最初に幅の広いものをチェックして、述語を並べ替えます (最初の述語ができるだけ多くのエントリを除外するようにします)。
  • 複雑さに応じて述語をソートします(より高速なエントリが最初に実行され、エントリが少ないほど低速になります)
  • 元のデータ構造を更新しませんが、フィルター処理された要素を含む並列セットを保持します vs
  • 毎回少数の人々をループするように、常にデータ構造を更新します
于 2013-01-28T23:30:58.850 に答える
2

実行速度の順に述語をソートすることをお勧めします。次に、最速の述語を最初に使用して、速度の順に述語を実行できます。これは、通常、低速の述語をより小さなセットで実行する必要があることを意味します。

ただし、この仮定は完全には正しくありません。削除された述語の割合を計算して実行速度を計算する必要があります。次に、最も高い割合のオブジェクトを削除する最速の述語はどれかを確認できます。次に、最適な順序で述語を実行できます。

独自の述語を簡単に実装できますinterface

public interface Predicate<T> {

    boolean filter(T object);

}

次に、ルールごとに述語オブジェクトを作成する必要があります。年齢と名前のチェックのために、さらに動的なクラスを作成して、必要なコードの量を減らすこともできます。

public class AgeCheck<T> implements Predicate<T> {

    private final int min;
    private final int max;
    public AgeCheck(int min, int max) {
        this.min = min;
        this.max = max;
    }

    @Override
    public boolean filter(T object) {
        // if( t.age() < max && t.age > min) ...
    }

}
于 2013-01-28T23:30:01.657 に答える
1

(この質問が 2 年前のものだとは知りませんでした。このパーティーに参加するのがとても遅くなりました! 著者が最終的にどのような解決策を使用したかを知っておくとよいでしょう。 )

ここで役立つライブラリはありますか? まあ、確かにある!

データ コレクションはそれほど大きくありませんが、不均衡に多数の述語があります。さらに、これらの述語をユーザーが管理し、一元的に保存する必要があります。これは、ルール エンジンであるDroolsに適しているように思われ、そのようなルールを作成、検証、および保存するための追加ツールが付属しています。

しかし、Drools は大規模で複雑になる可能性があります。おそらく、もっと簡単なものが必要ですか?あなたのコード サンプルと、速度に関する最初の要件から、オブジェクトにインデックスを付けるためのライブラリであるCQEngineについて考えさせられました。フィールド (名前フィールドなど) にインデックスを付け、これらのフィールドをさまざまな方法 (等しい、始まる、含むなど) で検索できます。高速でシンプルですが、索引付けしかできません。ルール定義などを自分で作成する必要があります。一方、CQEngine は論理述語をサポートしているため、and/or を使用して述語を連鎖させることができます。

また、ルール エンジンやオブジェクトのインデックス作成用のライブラリは他にもあります。他の人が回答にそれらをリストすると確信しています。

于 2015-02-14T18:55:36.840 に答える