sql >> Database teknologi >  >> RDS >> PostgreSQL

psycopg2 lækker hukommelse efter stor forespørgsel

Jeg løb ind i et lignende problem, og efter et par timers blod, sved og tårer fandt jeg ud af, at svaret blot kræver tilføjelse af én parameter.

I stedet for

cursor = conn.cursor()

skriv

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

eller endnu enklere

cursor = conn.cursor("my_cursor_name")

Detaljerne findes på http://initd.org/psycopg/docs/usage.html#server-side-cursors

Jeg fandt instruktionerne lidt forvirrende, da jeg selvom jeg skulle omskrive min SQL til at inkludere "DECLARE my_cursor_name ...." og derefter en "FETCH count 2000 FROM my_cursor_name", men det viser sig, at psycopg gør det hele for dig under emhætten, hvis du blot overskriver "name=None" standardparameteren, når du opretter en markør.

Forslaget ovenfor om at bruge fetchone eller fetchmany løser ikke problemet, da hvis du lader navneparameteren ikke indstilles, vil psycopg som standard forsøge at indlæse hele forespørgslen i ram. Den eneste anden ting, du muligvis skal (udover at angive en navneparameter) er at ændre cursor.itersize-attributten fra standard 2000 til at sige 1000, hvis du stadig har for lidt hukommelse.



  1. SQL Server-tabeller:hvad er forskellen mellem @, # og ##?

  2. Pivottabeller i MySQL

  3. Hvordan gemmer man BLOB som fil i PL/SQL?

  4. Kan tabellen ikke afkortes, fordi den refereres af en FOREIGN KEY-begrænsning?