5

大量のデータを使用する「数値計算」スタイルのアプリケーションの場合(「数百MB、ただしGBには収まらない」、つまりOS以外のメモリにうまく収まる)、すべてのデータをメモリに読み込むのは理にかなっていますか最初に処理を開始する前に、関連する大規模なデータセットの読み取り中にプログラムのIOバウンドを回避し、代わりにRAMからロードしますか?

この答えは、異なるデータバッキングを使用することによって変わりますか?つまり、XMLファイル、フラットファイル、完全なDBMSなどを使用しているかどうかに関係なく、答えは同じでしょうか。

4

2 に答える 2

8

あなたのプログラムは、そのボトルネックと同じくらい高速です。全体的なパフォーマンスが向上する場合は、データをメモリに保存するなどのことを行うことは理にかなっています。ただし、パフォーマンスが向上するという厳密なルールはありません。1 つのボトルネックを修正すると、新しい何かがボトルネックになります。したがって、1 つの問題を解決すると、次のボトルネックが何であるかに応じて、パフォーマンスが 1% または 1000% 向上する可能性があります。あなたが改善しているものは、まだボトルネックかもしれません。

これらのことは、一般的に次の 3 つのレベルのいずれかに当てはまると考えています。

  1. 熱心。ディスクやネットワーク、または計算結果から何かが必要な場合は、行って取得または実行します。これはプログラムが最も簡単で、テストとデバッグが最も簡単ですが、パフォーマンスは最悪です。この側面がボトルネックでない限り、これは問題ありません。
  2. 怠惰。特定の読み取りまたは計算を実行したら、数ミリ秒から永遠に続く可能性のある一定期間、それを再度実行しないでください。これにより、プログラムが非常に複雑になる可能性がありますが、読み取りや計算にコストがかかる場合は、多大なメリットが得られます。と
  3. 熱心すぎる。これは、前の 2 つの組み合わせによく似ています。結果はキャッシュされますが、読み取り、計算、または要求を行う代わりに、必要なものを予測するためのある程度のプリエンプティブ アクティビティがあります。ファイルから 10K を読み取る場合と同様に、後で次の 10K ブロックが必要になる可能性がかなり高くなります。実行を遅らせるのではなく、要求された場合に備えて取得します。

ここから得られる教訓は、Donald Knuth の「時期尚早の最適化は諸悪の根源である」という (やや乱用され、しばしば誤って引用されている) 引用です。熱心な解決策や過度に熱心な解決策は、膨大な量の複雑さを追加するため、有用な利益をもたらさない何かのためにそれらを行う意味はありません.

プログラマーは、何かの高度に (主張されている) 最適化されたバージョンを作成する必要があるかどうか、およびそれが役立つかどうかを判断する前に、よく間違いを犯します。

私自身の見解は次のとおりです。問題が発生するまで問題を解決しないでください。

于 2009-10-26T05:42:22.537 に答える
2

適切なデータ ストレージ方法を選択することは、ディスクからすべてを一度に読み取るか、必要に応じて読み取るかよりも効果があると思います。

ほとんどのデータベース テーブルには、各行のフィールドに通常のオフセットがあります。たとえば、customerレコードの長さが 50 バイトで、pants_size列が 12 バイト目から始まる場合があります。すべてのズボンのサイズを選択するのは、オフセット12、62、112、162 の値を取得するのと同じくらい簡単です。

ただし、XML は高速データ アクセスには適していません。データを取得するには、一連の可変長タグと属性をゆっくりと処理する必要があり、あるレコードから次のレコードに即座にジャンプすることはできません。ファイルを上記のようなデータ構造に解析しない限り。その場合、RDMS に非常によく似たものを使用することになります。

于 2009-10-26T06:35:11.860 に答える