Libpq使用大量内存作为简单示例

时间:2013-03-30 10:15:32

标签: c postgresql libpq

为什么以下代码使用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上。

2 个答案:

答案 0 :(得分:4)

默认情况下,libpq似乎会缓冲整个结果,而不是以块的形式读取它。

在9.2中,有一种方法可以更改此行为,请参阅Single row mode

我试过这个,在PQsendQuery()之后直接添加对PQsetSingleRowMode(conn)的调用,将内存使用量降低到几MB。问题解决了!

答案 1 :(得分:1)

处理可能较大的结果集的规范方法是为查询声明CURSOR并执行连续的FETCH调用以按块检索它们。

这也是设置psql变量时FETCH_COUNT所做的事情。

相关问题