0

私は 2D 水圧データを持っています。これは、グリッド内の各ポイントの深度と速度の情報を含むマルチギガバイトのテキスト ファイルで、タイム ステップに分割されています。各タイムステップには、グリッド内のすべてのポイントの深さ/速度の値が含まれています。したがって、タイムステップごとに 1 つのポイントを追跡し、その深さ/速度がどのように変化するかを確認できます。このデータを一度に 1 つのタイムステップで読み込み、グリッド セルが達成する最大深度、最大速度、水深が 2 フィートを超える最初のタイムステップの数など、さまざまなことを計算します。それぞれの結果これらの計算はグリッドになります - 各ポイントでの最大深度など。

これまでのところ、これは Decorator パターンのように思えます。ただし、さまざまな計算から結果を取得する方法がわかりません。計算ごとに異なるグリッドが生成されます。結果を抽出するために、作成後に各デコレーターへの参照を保持するかgetResults()、さまざまな結果のマップを返すメソッドを追加する必要がありますが、どちらも理想的ではありません。

別のオプションは、戦略パターンです。各計算は、時間ステップ (現在の深度/速度) と前のラウンドの結果 (これまでの最大深度、これまでの最大速度など) で動作する異なるアルゴリズムです。ただし、これらの以前の結果は計算ごとに異なります。つまり、アルゴリズム クラスがステートフルになるか、以前の結果を追跡してフィードすることが呼び出し元の仕事になります。また、ストラテジー パターンも嫌いです。 timesteps は呼び出し元の責任になります。「計算機」に timesteps のイテレータを与えて (必要に応じてディスクからフェッチして)、必要な結果を生成させたいと思います。

追加の制約:

  • 入力が大きく、ディスクから読み取られているため、時間ステップごとに 1 回だけ反復することが唯一の実用的な方法です
  • グリッドは大きいため、計算は可能な限りその場で行う必要があります
4

2 に答える 2

0

まず、問題を十分に理解しておらず、回答の要点を見逃している可能性があります。その場合は、お時間をいただき申し訳ありません。

一見すると、次の擬似コードのようなデータ指向のベースと組み合わせて、「戦略パターン」に似たアプローチを思いつきます。

foreach timeStamp

  readGridData

  foreach activeCalculator in activeCalculators

    useCalculatorPointerListToAccessSpecificStoredDataNeededForNewCalculation

    performCalculationOnFreshGridData

    updateUpdatableData

    presentUpdatedResultsToUser

    storeGridResultsInDataPool(OfResultBaseClassType)

    discardNoLongerNeededStoredGridResults

  next calculator
next timeStep

繰り返しますが、これが的外れである場合は申し訳ありません。

于 2012-09-11T17:19:45.637 に答える
0

私があなたの問題を正しく理解していれば、多くのタイムステップを持つ grid_points があり、各タイムステップには深さと速度があります。今では何GBものデータがあります。

データに対して 1 つのパスを実行し、解析されたデータを RDBMS に保存することをお勧めします。次に、このデータに対してクエリまたはストアド プロシージャを実行します。このようにして、少なくともアプリケーションがメモリ不足になることはありません

于 2012-09-11T17:10:39.377 に答える