Используя Python / PyGreSQL, как я могу эффективно обрабатывать большой набор результатов? - PullRequest
2 голосов
/ 20 сентября 2011

У меня есть набор результатов запроса ~ 9 миллионов строк.

Мне нужно выполнить некоторую обработку для каждой строки, и код в настоящее время делает это:

query = conn.query(sql)
results = query.getresult()

for row in results: 
    # blah

Я не уверен, но я представляю, что getresult() сносит весь набор результатов. Это тот случай? Я предполагаю, что есть способ вытягивать куски результирующего набора по проводам по мере необходимости, но я не сразу увидел что-то подобное в документации по pg.

Возможно ли сделать это с помощью модуля pgdb или каким-либо другим подходом?

Меня беспокоит память на компьютере приложения - я бы предпочел не загружать в память миллионы строк одновременно, если смогу помочь.

Стоит ли беспокоиться об этом?

Ответы [ 4 ]

3 голосов
/ 20 сентября 2011

Если он соответствует спецификации API базы данных Python , вы можете использовать курсор:

curs = conn.cursor()
curs.execute('select * from bigtable')

затем используйте curs.fetchone() или curs.fetchmany(chunksize)

2 голосов
/ 20 сентября 2011

pgdb - это итераторы

cursor = conn.cursor()
cursor.execute(sql)

for row in cursor:
   # do something with row

где conn создается из pgdb.connect(...)

0 голосов
/ 26 сентября 2011

используйте cursor.fetchmany () и убедитесь, что вы явно установили размер массива для обработки наборов строк, что дает вам необходимый баланс между производительностью и использованием памяти.

У меня есть задания, написанные на cx_Oracle (который также использует спецификацию DB-API), и использую его для перемещения таблиц с несколькими миллиардами строк по сети в пакетах по 20 000 записей. Это занимает некоторое время, но я не теряю память на сервере ни на стороне источника, ни на стороне цели.

0 голосов
/ 20 сентября 2011

Я не уверен, как ведет себя getresult(), но другой вариант будет PL / Python :

Процедурный язык PL / Python позволяет писать функции PostgreSQL вязык Python.

Это позволит вам работать прямо в базе данных.Это может не подходить для того, что вам нужно сделать, но стоит посмотреть.

...