2

データベースから大量のデータをロードし、そのデータに対してアルゴリズムを実行するC ++アプリケーションがあります(これらのアルゴリズムはCPUとデータを大量に消費するため、事前にすべてのデータをロードします)。データベースに戻しました。

データベース部分は、アプリケーションの他の部分からうまく分離されています。実際、アプリケーションはデータの出所を知る必要はありません。アプリケーションをファイルで起動することもできます(この場合、別のファイルモジュールがファイルをアプリケーションにロードし、最後にすべてのデータをファイルに保存します)。

今:

  • データベース層は、変更されたインスタンスを(完全なデータではなく)データベースに保存するだけでよいため、アプリケーションによって何が変更されたかを知る必要があります。
  • 一方、アプリケーションはデータの出所を知る必要がないため、データのインスタンスごとに状態の変化を維持することを余儀なくされていると感じたくありません。

アプリケーションとそのデータ構造を、データ(データベースまたはファイル)をロードおよび保存するレイヤーから可能な限り分離するために、起動後にインスタンスが変更されたかどうかに関する情報でアプリケーションのデータ構造を汚染したくありませんか否か。

ただし、データベースレイヤーを可能な限り効率的にするには、アプリケーションによって変更されたデータを判別する方法が必要です。

データは数GBのメモリを簡単にいっぱいにする可能性があるため、すべてのデータを複製して保存しながらデータを比較することはできません。

アプリケーションアルゴリズム内のパフォーマンスが非常に重要であるため、アプリケーションデータ構造にオブザーバーを追加することもできません(すべてのオブザーバーをループして仮想関数を呼び出すと、アルゴリズムに重大なパフォーマンスのボトルネックが発生する可能性があります)。

他の解決策はありますか?または、邪魔な方法でアプリケーションクラスにロジックを追加したくない場合は、「モジュラー」になりすぎないようにしていますか?これらの場合、実用的である方が良いですか?

ORMツールはこの問題をどのように解決しますか?また、アプリケーションクラスに一種の変更状態を保持するように強制しますか、それともクラスに変更オブザーバーを強制しますか?

4

1 に答える 1

1

データをコピーして比較できない場合は、明らかに、どこかに変更内容の何らかの記録が必要です。問題は、これらの記録をどのように更新するかです。

ORM ツールは (必要に応じて) オブジェクトにフラグを保持し、データが変更されたかどうか、変更された場合はどうなるかを示すことで問題を解決できます。フラグを更新できるきちんとカプセル化されたミューテーターを持つオブジェクトではなく、生のデータ構造をアプリケーションで使用できるようにしているように聞こえます。

そのため、通常、ORM ではアプリケーションが変更を詳細に追跡する必要はありません。通常、アプリケーションは保存するオブジェクトを指定する必要がありますが、ORM はそれを行うために DB に永続化する必要があるものを判断し、そこに最適化を適用する場合があります。

あなたの言葉では、ORM は大まかな意味でデータ構造にオブザーバーを追加していることを意味していると思います。それは外部のオブザーバーではなく、自分自身を変更する方法を知っているオブジェクトですが、もちろん、何が変更されたかを記録するにはいくらかのオーバーヘッドがあります。

1 つのオプションは、フラグを更新するデータ構造の「遅い」ミューテーターと、「高速」な直接アクセス、およびオブジェクトをダーティとしてマークする関数を提供することです。その場合、問題を無視できる潜在的に遅いミューテーターを使用するか、開始前にオブジェクトをダーティとしてマークする必要がある潜在的に高速なミューテーターを使用するかは、アプリケーションの選択になります。トランザクションと一貫性のない中間状態について行います)。

次に、2 つの基本的な状況があります。

  • 私は非常に大きなオブジェクトのセットをループしており、条件付きでそれらのいくつかに単一の変更を加えています。アプリケーションを簡単にするために、「遅い」ミューテーターを使用します。
  • 同じオブジェクトにさまざまな変更を加えていますが、アクセサーのパフォーマンスが非常に気になります。おそらくデータ内の配列を直接公開する「高速」ミューテーターを使用します。永続化モデルについて詳しく知ることと引き換えに、パフォーマンスが向上します。

コンピューター サイエンスには、キャッシュの無効化と名前付けという 2 つの難しい問題しかありません。

フィル・カールトン

于 2010-11-04T17:29:58.860 に答える