2009-05-20 15 views
1

1)ClientAppはASP.Net 2.0への非同期呼び出しWebサービス 2)Webサービスは、SQL Server 2005のストアドプロシージャ 3)呼び出しストアドプロシージャは、データ出力を返し、150メガバイトのテーブルWebサービスが

を作ります

メモリ不足新しい行にさらにメモリを割り当てようとしているときに、DataAdapter.Fill(...)によって例外がスローされます。

IISアプリケーションプールには、最大メモリ制限がありません。

IISレベルのどこかで最大のメモリ使用率上限が設定されていますか? 150MBのDBテーブルは、DataSetとしてメモリに読み込まれると、さらに多くの領域を占有しますか? プロシージャの結果がWebサーバーのメモリに常駐する必要はないが、クライアントに直接ストリームされるシナリオが(WCFの場合)おそらくありますか?

クライアントが非同期に要求するため、要求をより小さなデータセットに分割したくない場合があります。すべての部分を収集することも非同期的に行われなければならず、各クライアントは各呼び出しに対して非同期収集を実装する必要があります。

どのような提案、ベストプラクティス、ヒントもありがとうございます。

+0

質問のいくつか。 1)これはWindows Serverの32ビット版でホストされていますか? 2)アプリケーションプールのワーカープロセスがクラッシュしたときのプロセスの大きさはどれですか? – Jeff

答えて

5

はい、データセットを使用すると、実際のデータよりも多くのメモリが使用されます。どのくらい定量化するのが難しいですか?しかし、StackOverflowのthis質問は元のデータサイズの4倍以上を示唆しています。それが正しいと仮定しましょう。 150MBのデータ時間4 = 600MBのメモリ。 ASP.NETアプリケーションで約800MBのRAMを使用すると、OutOfMemoryExceptionsがスローされます。その制限がアプリケーションプールのメモリ制限とどのように同じであるかわかりません。あなたはboot.iniで/ 3GBスイッチを試しましたか? (手順については、this articleを参照してください)

はまた、あなたがあなたのDataSetをシリアル化している場合、シリアライザはthis articleを参照してください、最大10倍のサイズ(シリアル化のための巨大なバッファを割り当てることができる。あなたが読んだときに、問題が発生したことを示していることに注意してくださいこれはおそらくエラーの原因ではありません(ただし、メモリ不足の問題を解決してデータをワイヤで送信しようとした場合など)。最初は良いアイデアだが、すぐに問題にぶつかるだろう。

もう一つの(おそらくもっと良い)解決策は、DataReaderを使ってo一度に1行ずつ。行のバッチを返します(つまり、データのページングを使用します)。各バッチのサイズを試して、パフォーマンスとメモリ使用の間のスイートスポットを見つけます。 WCFストリーミングはこのトリックを行うかもしれませんが、1回の呼び出しで大量のデータを返すようにWCFを正しく設定する必要があります。

0

ベストプラクティスは、a)大量のデータを返さず、b)4歳の技術(ASMX Webサービス)ではなくWCFを使用することです。

+0

WCFはどのようにADO.Net DataSet.Fill()例外を処理しますか?メモリ不足は、DataSetがWebサーバーのメモリに完全にロードされる前に発生します。それはまだWebサービスの応答として転送のためにシリアル化され始めていません。 WCFをDataSetのメモリにロードせずにSQLから直接クライアントにデータをストリーミングするように設定できますか? – Tion

+2

私はWCFがSystem.IO.Streamを返すことでストリームできることを知っています。さらに悪いことに、ExecuteReaderを使うことができます。その後、出力StreamにXmlWriterを構築し、Readで返された各行について、内容のある単一のXML要素を記述します。もっとコードですが、うまくいくはずです。おそらくより良い方法もあります。あなたは本当に1回の呼び出しですべての150メガバイトを返す必要がありますか? –