テーブルとメモリの使用状況

適用対象: Outlook 2013 | Outlook 2016

テーブルからのデータの取得に関連する重要な問題は、メモリ使用量です。 使用可能なメモリが不足すると、 IMAPITable::QueryRowsHrQueryAllRows が失敗し、必要な行数未満が返される可能性があります。 テーブル データの取得に使用するメソッドまたは関数の決定は、テーブルがメモリ内に収まると予想できるかどうか、およびできない場合は失敗が許容されるかどうかによって異なります。

一度にメモリに収まるデータの量を決めるのは常に簡単ではないため、MAPI では、クライアント アプリケーションまたはサービス プロバイダーが従ういくつかの基本的なガイドラインが提供されます。 特定のテーブルの実装と基になるデータの格納方法に基づいて、常に例外があることに注意してください。

次のガイドラインを使用して、テーブル のメモリ使用量を評価できます。

  • クライアントは、ワーキング セットのメモリ使用量をメガバイトの範囲で許容でき、テーブル全体をメモリに読み取る際に問題がないと想定できます。

  • 制限は、テーブルのメモリ使用量に影響します。 コンテンツ テーブルなど、多数の行を含む厳しく制限されたテーブルはメモリに収まることが予想されますが、無制限の大きなテーブルは通常は収まりません。

  • MAPI が所有する一部のテーブル (状態、プロファイル、メッセージ サービス、プロバイダー、メッセージ ストア テーブルなど) は、通常メモリに収まります。 これらは一般的に小さなテーブルです。 ただし、例外があります。 たとえば、サーバー ベースのプロファイル プロバイダーでは、収まらない大きなプロファイル テーブルが生成される場合があります。

問題なくメモリに収まるテーブルからすべての行を取得するには、 HrQueryAllRows を呼び出し、行の最大数を 0 に設定します。

メモリに収まる可能性がある、またはメモリに収まらない可能性があるテーブルからすべての行を取得するには、最大行数を指定して HrQueryAllRows を呼び出します。 行の最大数は、必要な行の最小数を超える数に設定する必要があります。 クライアントが 300 行のテーブルから少なくとも 50 行にアクセスする必要がある場合は、行の最大数を少なくとも 51 に設定する必要があります。

メモリに収まらないと予想されるテーブルからすべての行を取得するには、次のコード サンプルに示すように、比較的小さい行数のループで IMAPITable::QueryRows を呼び出します。

HRESULT     hr;
LPSRowSet   pRows = NULL;
LONG        irow;
LONG            cAsk = 50;                  // adjust this value
while ((hr = pTable->QueryRows(cAsk, 0, &pRows)) == hrSuccess
        && pRows->cRows != 0)
{
    for (irow = 0; irow < prows->cRows; ++irow)
    {
        // process the row...
    }
    FreeProws(pRows);
    pRows = NULL;
}
if (hr)
{
    // handle the error...
}
 

このループが完了し、テーブル内のすべての行が処理され、 cRows が 0 の場合、カーソルの位置は通常、テーブルの下部になります。

関連項目