現在オフラインです。再接続するためにインターネットの接続を待っています

データセットのシリアル化とリモート処理のパフォーマンスの向上

概要
この資料では、大規模な .NET Framework System.Data.DataSet クラスでのパフォーマンスの最適化について説明し、サンプルのシリアル化ラッパー クラスを提供します。これは、大きな DataSet クラスのシリアル化および逆シリアル化をより効率的に行うように最適化されています。
詳細
プロセス間で System.Data.DataSet オブジェクトを渡すときは、.NET Framework のリモート処理で DataSet クラスのシリアル化、転送、逆シリアル化が行われます。DataSet クラスを .NET Web サービスから返すとき、データセットのデータは内部的に Microsoft .NET Framework の System.Xml.Serialization.XMLSerializer クラスでシリアル化されてからクライアントに渡されます。COM+ でホストされているマネージ オブジェクトからデータセットを返すときは、.NET Framework のリモート処理によって BinaryFormatter クラスが使用されます。.NET Framework がどのリモート機構を使用するかに関係なく、DataSet クラスはデータをシリアル化する際に内部データを常に XML に変換します。

Microsoft .NET Framework 1.0 および .NET Framework 1.1 に含まれている DataSet クラスは、データセット内の小さなデータ (数百行規模) を .NET Framework のリモート処理でシリアル化する場合は効率的に動作します。このシリアル化機構は大きなデータセット (数千行規模) では効率的でなく、一時 (短期) メモリの割り当てを多数発生させます。これらのメモリ割り当てのためにアプリケーションのスケーラビリティが低下します。

: 一時メモリ割り当てとは、コードのある区間を処理している間に生じる短期的なメモリ割り当てのことです。たとえば、シリアル化のとき、リモート処理のとき、または DataSet クラスの逆シリアル化のとき、リモート要求を処理するために .NET Framework のリモート処理では内部的にさまざまなマネージ オブジェクトを割り当て、またそれらの割り当てを解除します。割り当ておよび割り当て解除の対象となるマネージ オブジェクトのサイズが大きいほど、.NET のメモリ管理システムにかかる負荷は大きくなり、全般的なスケーラビリティが低下します。たとえば、実行中にメソッドを多数呼び出して大量の一時メモリ割り当てを発生させるアプリーションでは、すべてのメソッド呼び出しが完了しないうちにメモリ不足が発生する可能性があります。

適切に設計されたサロゲートの型またはシリアル化ラッパー クラスを使用することで、大規模なデータセットのシリアル化とリモート処理のパフォーマンスを大幅に向上できます。.NET Framework の DataSet クラスでサロゲート機構とラッパー機構を使用する方法の詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。なお、この資料ではデータセットのサロゲートの型やシリアル化ラッパー クラスの実装方法を示す完全なサンプルは提供しません。

この資料に掲載されているサンプルのシリアル化ラッパー クラスは、大規模なデータセットのシリアル化/逆シリアル化を効率的に行えるように最適化したものです。このクラスは、典型的なデータセットのリモート処理で一時メモリ割り当ての発生を大きく抑えます。一時メモリ割り当てが大幅に減少することで、エンド ツー エンドのリモート処理時間も短縮され、大規模なデータセットを使用するときのスケーラビリティが向上します。

このサンプルでは、DataSetSurrogate という名前のシリアル化ラッパー クラスを提供しています。DataSetSurrogate クラスは、リモート処理の対象となる任意のデータセットのラッパー クラスとして使用します。このサーバー コンポーネントは、必要なデータセットを DataSetSurrogate コンストラクタに渡し、その後、DataSetSurrogate クラスをクライアントに返します。クライアント側では、DataSetSurrogate.ConvertToDataSet メソッドを使用して DataSetSurrogate クラスからデータセットが抽出されます。

DataSetSurrogate クラスは Serializable とマークされており、DataSetSurrogate クラス内のすべてのフィールドもシリアル化可能なクラスです。したがって、DataSetSurrogate オブジェクトをリモート処理するときは、リモート処理のインフラストラクチャによって DataSetSurrogate オブジェクトとそのすべてのフィールドのシリアル化および逆シリアル化が自動的に行われます。シリアル化に関して DataSetSurrogate クラスが DataSet クラスよりも優れている点は、DataSetSurrogate クラスではデータをバイナリ形式でシリアル化することです。バイナリ形式を使用したシリアル化は、データセットの現在の XML シリアル化形式よりもメモリと CPU の使用効率が大幅に高くなります。

: このシリアル化ラッパー クラスの効果を最大限引き出すため、リモート処理のとき .NET Framework の System.Runtime.Serialization.Formatters.Binary.BinaryFormatter クラスを使用してください。.NET Framework の System.Runtime.Serialization.Formatters.Soap.SoapFormatter クラスによるリモート処理は、DataSetSurrogate クラスを使用する場合にはあまり効率的でありません。

下記のファイルは、「Microsoft ダウンロード センター」からダウンロードできます。
ダウンロードSurrogateSample.exe パッケージマイクロソフトのサポート ファイルのダウンロード方法を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
119591 オンライン サービスからマイクロソフトのサポート ファイルを入手する方法
マイクロソフトでは、アップロード時点の最新のウイルス検査プログラムを使用して、配布ファイルのウイルス チェックを行っています。配布ファイルはセキュリティで保護されたサーバー上に置かれており、権限のない第三者が無断でファイルを変更できないようになっています。

サンプル ファイルへのアクセス

SurrogateSample.exe ファイルをコンピュータの C ドライブに保存します。そこから、フォルダ構造を抽出できます。詳しい手順については、各フォルダの readme.txt ファイルを参照してください。
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 829740 (最終更新日 2004-08-04) を基に作成したものです。
プロパティ

文書番号:829740 - 最終更新日: 09/02/2005 09:23:00 - リビジョン: 1.3

  • Microsoft .NET Framework 1.0
  • Microsoft .NET Framework 1.1
  • kbinfo kbdownload KB829740
フィードバック