3

次のコードが実行に 1.2GB のメモリを使用するのはなぜですか? generate_series に渡される数値に関係なく、メモリ使用量は比較的一定であると予想していましたが、着実に増加しています。お願いします - 私が何か間違ったことをしていると教えてください!

if (!PQsendQuery(conn, "select generate_series(1, 10000000)"))
    exit(1);

int i, value;
while (res = PQgetResult(conn)) {
    for (i = 0; i < PQntuples(res); i++) {
        value = atoi(PQgetvalue(res, i, 0));
    }
    PQclear(res);
}

printf("%d\n", value);
PQfinish(conn);

この例の完全なソース コードは、pastebinに置きました。

4

2 に答える 2

5

デフォルトでは、libpq は結果をチャンクで読み取るのではなく、結果全体をバッファリングしているようです。

9.2 では、この動作を変更する方法があります。シングル行モードを参照してください。

私はこれを試し、PQsendQuery() の直後に PQsetSingleRowMode(conn) への呼び出しを追加すると、メモリ使用量が数 MB に減少しました。問題が解決しました!

于 2013-03-30T11:49:40.890 に答える
2

大きくなる可能性のある結果セットを処理する標準的な方法は、クエリの CURSOR を宣言し、連続したFETCH呼び出しを実行してチャンクごとに取得することです。

これpsqlは、FETCH_COUNT変数が設定されている場合にも行われます。

于 2013-03-30T12:37:07.953 に答える