PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

psycopg2 изтичаща памет след голяма заявка

Попаднах на подобен проблем и след няколко часа кръв, пот и сълзи открих, че отговорът просто изисква добавяне на един параметър.

Вместо

cursor = conn.cursor()

пишете

cursor = conn.cursor(name="my_cursor_name")

или още по-просто

cursor = conn.cursor("my_cursor_name")

Подробностите се намират на http://initd.org/psycopg/docs/usage.html#server-side-cursors

Намерих инструкциите за малко объркващи, тъй като реших, че ще трябва да пренапиша своя SQL, за да включа "DECLARE my_cursor_name ..." и след това "FETCH count 2000 FROM my_cursor_name", но се оказа, че psycopg прави всичко това вместо вас под hood, ако просто презапишете параметъра по подразбиране "name=None", когато създавате курсор.

Предложението по-горе за използване на fetchone или fetchmany не решава проблема, тъй като, ако оставите параметъра за име ненастроен, psycopg по подразбиране ще се опита да зареди цялата заявка в ram. Единственото друго нещо, което може да се наложи да направите (освен да декларирате параметър за име), е да промените атрибута cursor.itersize от 2000 по подразбиране на 1000, ако все още имате твърде малко памет.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Прави заявка за таблица в postgres

  2. Преобразувайте всички записи в postgres в Titlecase, първа буква с главни букви

  3. Настройка на Django и PostgreSQL на две различни EC2 инстанции

  4. Как да извлечете най-доброто от PostgreSQL регистрационните файлове

  5. Архивиране и възстановяване на PostgreSQL 9.0