0

シンプルなページのウェブサイトがあります。ボタンをクリックすると、20 列で約 200,000 行を返す MDX クエリが実行されます。次のコードを使用して、Microsoft.AnalysisServices.AdomdClient ライブラリを使用して MDX クエリを実行します (バージョンは 10.0.0.0 ランタイム バージョン v2.0.50727)。

        var connection = new AdomdConnection(connectionString);
        var command = new AdomdCommand(query, connection)
        {
            CommandTimeout =  900
        };

       connection.ShowHiddenObjects = true;
       connection.Open();
       var cellSet = command.ExecuteCellSet();
       connection.Close();

クエリが実行されている間、アプリケーション プールのメモリ使用量が非常に高くなります。

これは、サーバーのメモリ使用量の初期状態です。 初期状態

クエリを実行した後: ここに画像の説明を入力

なぜメモリ使用量が非常に高くなり、そのままになるのかはわかりません。ローカル ボックスでプロファイラーを使用しましたが、すべて問題ないように見えました。

何がメモリを保持しているのかを理解するために必要なオプションは何ですか?

このメモリをクリアする明示的な方法はありますか?

ADOMD ライブラリは常にこの量のメモリを消費しますか? C# を使用して MDX クエリを実行する代替オプションはありますか?

メモリ使用量がこれほど高くなると、IIS は他のクエリの処理を停止し、同じ IIS サーバー (別のアプリケーション プールを使用) でホストされているアプリケーションも影響を受け、要求の実行に時間がかかります。

4

1 に答える 1

0

私は最近、同様の問題を抱えている場所から始めました。

メモリを保持しているものを把握するためのオプションは次のとおりです。

  1. Redgate の Ants プロファイラーなどのメモリ プロファイラーをダウンロードすると、アプリ プールで何が起こっているかを確認できます。ただし、試用版は 2 週間しかありませんが、最初に何が起こっているかを確認できます。

  2. CLR Profiler を入手してください。このツールをダウンロードすると、メモリのスナップショットを表示できるため、CLR のメモリ内に何があるかがわかります。

注意すべきことの 1 つは、Large Object Heap です。設計上、CLR は LOH 内のスペースを圧縮しないため、オブジェクトがそこに配置されると、メモリの断片化につながる可能性があります。85000 バイトを超えるオブジェクトはそこに配置されます。1 つの例は、オブジェクトの大きなリストです。

それを回避するために私が試みたことの1つは、基本的にリストのリストである複合リストのような特殊なコレクションを作成することです。各コンポーネントリストは85000バイト未満であるため、通常のヒープに残り、オブジェクト全体が失われますLOH に入れられます。他の人もこのアプローチについて言及しています。

とはいえ、複合リストでは問題が実際に解決されていないため、解決する必要がある他の要因がまだ残っているため、まだ問題があります。私はそれに戸惑い、アプリ プールのメモリ ダンプと winDbg での分析がさらなる答えを提供するかもしれないと考えています。

もう1つのポイントは、問題の原因ではないことは確かですが、接続にusingステートメントを使用することをお勧めします。そうしないと、closeステートメントの前に例外がある場合、閉じられない可能性があります。

于 2013-06-05T11:52:33.370 に答える