2009-03-26 3 views
2

DataSetを大量に使用するレガシーシステムで、これらをビジネスオブジェクトやその他のより効率的なデータ構造に置き換える可能性はほとんどありません。ADO.NET DataSetのメモリフットプリントを最小限に抑えますか?

DataSetのメモリフットプリントを減らす方法はありますか?

初期容量の設定(制限付きの場合)、制限の解除などについて考えていますが、DataSetsの経験はほとんどなく、特定のオプションが利用可能かどうか、まったく。

更新:

私は長期的なリファクタリングの可能性を認識していますが、私はプロパティは、メモリのオーバーヘッドに影響を与えることが知られているデータセットに保存されたDataTableオブジェクト、つまり一連の与えられたクイックフィックスを探しています。

データが内部的に格納されるため、最初の容量の設定は1つの方法にすることができます。これにより、オブジェクトが1行追加する際に任意に大量のメモリを割り当てることができなくなります。

答えて

0
  1. VS2005 +を使用している場合は、DataSet全体ではなくDataTableオブジェクトをインスタンス化できます。 2003年に、DataTableがインスタンス化されると、デフォルトでDataSetが提供されます。 2005年以降は、DataTableだけが得られます。

  2. DataSetsまたはDataTablesを満たすためのデータアクセスレイヤーを見てください。多くの場合、データが大量に送られてきます。より具体的なクエリを作成します。

  3. あなたが使用しているコードが、渡されたときにDataSetsをコピーするような面倒なことをしていないことを確認してください。コピーを作成するのではなく、.SelectステートメントまたはDataViewを使用してフィルタリングと並べ替えを行っていることを確認してください。

DataSetsのクイックな「最適化」はありません。メモリに問題がある場合は、項目2と3を使用します。これは、使用するデータ転送オブジェクトのタイプに関係なく発生します。

そして、DataSetsをうまく活用してください。あなたがそれらに精通していない場合は、何かのように愚かなことをすることができます。その後、あなたは彼らがどれほど知っているかについての記事である、彼らが吸う方法についての記事を書いていきます。彼らは本当に非常に便利で、維持しやすいです。カップルのヒント:

  • 型付きデータセットを使用します。彼らはあなたに巨大なコーディングを保存し、タイプされているので、簡単な検証で役立ちます。
  • タイプされたDSを使用している場合は、生成されたコードファイルを変更しないでください。 VS2005 +を使用している場合は、DSの部分クラス(.designerコードファイルではありません)に任意のカスタムビジネスオブジェクトビヘイビアを配置できます。
  • DataViewを使用し、DataRowオブジェクトをループしている場所であれば.Selectを使用します。
  • 良いコード生成ツールを探して、DSからのデータの埋め込みや更新のための合理的なデータアクセスフレームワークを構築してください。問題の1つは、デザイナーがDSのデザインをdb内のテーブルに直接結び付けて、データ構造の変更に脆弱になることがあることです。もしあなたがそうしなければならない場合は、CodeSmithのようにデータベースからデータアクセス層を構築するためにコードジェネレータをビルドまたは使用してください。まず、ストアドプロシージャとデータアクセスクラスを生成するためのCodeSmithのテンプレートをいくつか見てみましょう。
  • "オブジェクト"と "DataSets"の関係について話すとき、オブジェクトはこの場合DataSetではなくDataRowです。そして、部分クラスのために、あなたは "オブジェクト"に行動を加えることができ、コードを書くのが好きな人に "オブジェクト"の利点の95%を与えます。
1

これは不都合なことですが、同じケースで大いに役立ちます。

データセットに同じ文字列をたくさん格納している場合(例:町の名前は、文字列ごとに1つの文字列オブジェクトのみを使用してください。

Directory <string, string> towns = new Directory <string, string>(); 
foreach(var row in datatable) 
{ 
    if (towns.contains(row.town)) 
    { 
     row.town = towns[row.town] 
    } 
    else 
    { 
     towns[row.town] = row.town; 
    } 
} 
GCは重複した文字列の大半を再利用できますが、データセットが存続する場合にのみ有効です。

rowCreatedイベントでこれを行うと、すべての重複した文字列オブジェクトが最初に作成されないことがあります。

+0

...ちょうど64ビットに移動し、より多くのRAMを購入するより安いかもしれしかし

。現実世界のデータでこれをテストして、メモリの削減とCPUサイクルへの影響を測定する必要があります。 –

0

コードビハインドファイルの中にテーブルと行を実装してみることもできます。次に時間の経過とともに、テーブル/行ではなく、これらのインタフェースを直接使用するようにコードを変更します。

ほとんどのコードでインターフェイスを使用すると、コード生成を使用して、行/テーブルのオーバーヘッドなしにこれらのインターフェイスを実装するC#クラスを作成できます。考えかもしれません

+0

Eegads!うんざり! –

関連する問題