2015-02-22 7 views
0

При попытке загрузить большую партию данных из Postgres 9.3 в C через libpq's PQexec, мне интересно, есть ли способ передать результирующий набор с сервера. От просмотра сверху я вижу, что использование памяти увеличивается примерно на ожидаемый размер набора результатов, когда я звоню PQexec. Я хочу повторить результаты и «отбросить» результаты после того, как я их обработал, чтобы сохранить использование памяти на узле обработки. Я не мог найти упоминания о таком поведении в docs. Что-то вроде psycopg2's fetchmany было бы идеально.Streaming libpq Результаты от PQexec

Это единственный способ «потока» результатов из libpq путем перезаписи запроса для запуска в партиях?

ответ

1

С недавним успехом libpq (отправка с помощью libpq-5.5 с PostgreSQL 9.2) вы можете позвонить PQsetSingleRowMode, как описано в Retrieving Query Results Row-By-Row. PQexec должен быть заменен асинхронным PQsendQuery.

В противном случае метод, который работает со всеми версиями, - это открыть курсор на уровне SQL (см. DECLARE...CURSOR) и FETCH от него через последовательные вызовы PQexec до завершения. Так как FETCH_COUNT реализован в psql, инструменте командной строки.
Он также имеет то преимущество, что другие запросы могут выполняться в одном и том же соединении, пока курсор открывается, и программа по-прежнему перебирает результаты.