2

私は、多くの制約を受けて、最適なシフト割り当てを自動的に見つけるプログラムに取り組んでいます。私はgrailsを使用しています。つまり、労働者、シフト、および割り当てに関するデータはDBMSに保存されます。小さなサブセットで集中的に動作しているときに、インメモリインデックスを構築してDBを迂回させることをお勧めしますか?

最適化自体については、データの小さなサブセット(約5つの異なるテーブルから合計約600行)で非常に集中して作業する必要があります。私は繰り返す必要があり、様々なサブサブセットを数十回検索してフィットネス機能を計算し、値を変更し、再びフィットネスを計算し、泡立て、すすぎ、繰り返し、おそらく何百回も繰り返さなければならない。

ここで、検索と繰り返しはまさにDBMSのためのものですが、この場合、何百ものDB要求のオーバーヘッドは、HSQLDBのようなメモリ内のDBMSの場合でも実際の作業が邪魔になると思います。その代わりに、私はサブセット全体を最初にメモリにスラッピングし、自分で行うべき索引(主にHashMap)を作成してから、DBから離れたところで作業します私は完了し、私の結果をそれに書き込む。

これは健全なアプローチですか?どんな良いアイデアですか?

答えて

1

データベースに何百ものコマンドを発行する必要があるとしますか? DB内でコードを実行する方法はありませんか?

私が心配する主なことは完全性です。正しくロックを扱うようにしてください。おそらく、どこかに格納されたバージョン番号が必要なので、処理中にデータ全体をロックする必要はありません。更新トランザクションでは、最初に読んだときと同じバージョン番号を使用します。

最後に、ベンチマークですか?私は昨年ほどにいくつかのアプリをやったことがありますが、それは要求ごとに同様の非常に集中的な計算プロセスを持っていました。インプロセスオブジェクトを使用してデータを表現すると、要求ごとにデータベースに当たるよりも効率的になりました。しかし、すべてのアプリは異なっており、影響を受けることは考慮されていない可能性があります。

+0

私は理論的にはストアドプロシージャ内の最適化作業をすべて行うことができますが、PL/pgSQLではなく、JavaストアドプロシージャでDBを使用することはできません。 –

+0

ロックは良い点ですが、私は多くの並流ユーザー、特に同じスケジュールを最適化しようとする同時並行ユーザーは期待していません。私は間違いなくパフォーマンスのボトルネックを見つけるためにプロファイルを使用します。 –