テーブルとメモリ使用量Tables and memory usage

適用されます: OutlookApplies to: Outlook

テーブルからデータを取得するのに接続されている重要な問題は、メモリ使用量です。An important issue connected with retrieving data from a table is memory usage. メモリ不足の発生することがIMAPITable::QueryRowsHrQueryAllRowsが失敗し、返す行の必要な数よりも少ない。Lack of available memory can cause IMAPITable::QueryRows and HrQueryAllRows to fail, returning less than the desired number of rows. またはテーブルのデータを取得するために使用する関数を決定する際に依存テーブルがメモリに収まるように期待できるかどうか、できない場合は、失敗が許容される場合。Deciding which method or function to use to retrieve table data depends on whether the table can be expected to fit in memory, and if it cannot, if failure is acceptable.

簡単ではありません常にメモリに同時に適合するデータの量を決定する、ために、MAPI は、いくつかの基本的なガイドラインに従うには、クライアント アプリケーションまたはサービス プロバイダーを提供します。Because it is not always easy to determine the amount of data that will fit into memory at one time, MAPI provides some basic guidelines for a client application or service provider to follow. 特定のテーブルの実装と、基になるデータを格納する方法に基づいて、例外は常に注意してください。Remember that there are always exceptions, based on the particular table implementation and how the underlying data is stored.

テーブルのメモリ使用量を評価するためには、次のガイドラインを使用できます。The following guidelines can be used to evaluate table memory usage:

  • 臨時ワーキング セット メモリの使用量メガバイトの範囲内で許容できるおよびそれらを使用すると見なすことができるクライアントには、メモリにテーブル全体を読み取り中に問題はありません。Clients that can tolerate occasional working set memory usage in the megabyte range and can assume they will have no problems reading an entire table into memory.

  • 制限では、メモリのテーブルの使用状況に影響があります。Restrictions have an affect on a table's usage of memory. 無制限の大規模なテーブルは通常できないときに、メモリに収まるように厳しく制限されるなど、内容のテーブルの行の数を広範なテーブルが期待できます。A severely restricted table with an extensive number of rows, such as a contents table, can be expected to fit into memory while an unrestricted large table usually cannot.

  • メモリに収まる状態、プロファイル、メッセージ サービス、プロバイダー、およびメッセージ ストアのテーブルなど、MAPI によって所有されているテーブルのいくつかが通常です。Several of the tables owned by MAPI such as the status, profile, message service, provider, and message store tables, will usually fit in memory. これらは、一般的に小さいテーブルです。These are generally small tables. ただし、これには例外があります。However, there are exceptions. などのサーバー ベースのプロファイル プロバイダーは、適合することはできません大きいプロファイル表を生成する可能性があります。For example, a server-based profile provider might generate a larger profile table that will not be able to fit.

問題なくメモリに収まるテーブルからすべての行を取得、 HrQueryAllRows行の最大数を 0 に設定を呼び出します。To retrieve all of the rows from a table that will fit into memory with no problems, call HrQueryAllRows, setting the maximum number of rows to zero.

、エラーを生成する、メモリに収まらないことがありますか可能性がありますテーブルからすべての行を取得するには、行の最大数を指定するHrQueryAllRowsを呼び出します。To retrieve all of the rows from a table that might or might not fit into memory, generating an error, call HrQueryAllRows specifying a maximum number of rows. 行の最大数が設定数に必要な行の最小数を超える。The maximum number of rows should be set to a number greater than the minimum number of rows that are needed. クライアントは、300 行のテーブルから 50 以上の行にアクセスする必要がある場合、は、51 以上に行の最大数を設定する必要があります。If a client must access at least 50 rows from a 300 row table, the maximum number of rows should be set to at least 51.

メモリに収まるように予期しないテーブルからすべての行を取得するには、コード例を次に示すように比較的少数の行の数では、ループにIMAPITable::QueryRowsを呼び出します。To retrieve all of the rows from a table that is not expected to fit into memory, call IMAPITable::QueryRows in a loop with a relatively small row count, as the following code sample illustrates:

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...
}
 

このループが完了するし、テーブル内のすべての行が処理されたが、_カラス_はゼロをカーソルの位置は通常、テーブルの下部にあります。When this loop completes and all the rows in the table have been processed and cRows is zero, the position of the cursor will usually be at the bottom of the table.

関連項目See also