2017-01-28 6 views
0

Javaを使用して、整数のソースデータセットを取得しましたが、それは大きくはありませんが、30,000を超える値は得られません。Javaでの依存値の計算

ソースデータセットを使用して、私は作成したいいくつかのサマリー値を持っています(これらはドメイン固有であり、Apache Mathなどのライブラリでは見つけられません)。

このような集計値との関係があります:

[source data] -> summary1 -> summary2 -> summary3 
        \     ^
         \____________________| 

Iが過エンジニアリングソリューションたくありませんが、私が構築する追加の集計値があるかもしれないことを将来に期待していますこのグラフ上にある。現在のところ、私のソリューションには、各要約のための「ゲッター」を持つドメインオブジェクトがあり、それがすでに計算されているかどうかをチェックし、必要に応じて計算を実行するだけです。これは正常に動作しますが、私はこの計算ロジックをすべて私のドメインオブジェクトに持たせるのが好きではありません。

結果がマップに保存され、計算機が必要とする「キー」を知っているキー - >電卓の設計のように表現できるように感じます。私が外に出てこれを実装する前に、誰かがまだこれをやっていない(1000回)と想像するのは非常に難しいです。

このような種類の問題空間を探す価値があるイディオムやライブラリについて助言してもらえますか?私はJGraphのようなものに精通していますが、ノード上で計算機を関連付けることはできません。単にグラフモデルを提供するだけです。おそらくこれはキャッシングライブラリにとってより問題になりますか?

+0

私はあなたが持っている問題を完全に理解していませんが、Guavaの最新バージョンではGraphタイプが実装されています。 –

+0

ありがとうございましたが、GuavaのグラフをJGraphと同じカテゴリに入れました。グラフのキャッシュ/評価ではなくグラフのデータ構造を提供しています。 – Scruffers

答えて

0

アイデアは、読み込みキャッシュ(別名自動読み込み、別名読み込み)の典型的なアプリケーションのようです。私は、要約タイプごとにキャッシュをお勧め最高のパフォーマンスを実現するために

Cache<Key, Integer> summary1cache = new Cache2kBuilder<Key, Integer>() {} 
    .loader(this::calculateSummary1) 
    .build(); 

    int calculateSummary1(Key key) { 
    ... 
    } 

cache2kでそれを行うための一例。ユーザーガイドには、cache loaders/read throughに関するさらに詳しい情報があります。

他のキャッシュとまったく同じことができます。グアバキャッシュまたはカフェイン。

代替パターンはMap.computeIfAbsent(key, function)です。しかし、ローダー機能が最初からわかっているなら、それを使ってキャッシュを設定することをお勧めします。

免責事項:あなたが持っているキー/サマリーの数とアクセスパターンがどのように見えるかという質問から完全にはっきりしないため、これが最良の解決策であるかどうかは100%はわかりません。

+0

ありがとう@cruftex。私は明確にすべきだった。私は10以上の要約があるとは思わない。アクセスパターンは頻繁に更新されません(基本データは理論上は編集可能ですがかなり修正されています)。読み取りも低くなります - 単一のユーザーUIに表示されるように最大10/minかもしれません。ここでのパフォーマンスにはキャッシュは必要ありませんが、電卓のキーパターンは計算グラフをきれいに分割します。 – Scruffers