Psycopg2 hat eine schöne Schnittstelle für die Arbeit mit serverseitigen Cursorn. Dies ist eine mögliche zu verwendende Vorlage:
with psycopg2.connect(database_connection_string) as conn:
with conn.cursor(name='name_of_cursor') as cursor:
cursor.itersize = 20000
query = "SELECT * FROM ..."
cursor.execute(query)
for row in cursor:
# process row
Der obige Code erstellt die Verbindung und platziert das Abfrageergebnis automatisch in einem serverseitigen Cursor. Der Wert itersize
legt die Anzahl der Zeilen fest, die der Client gleichzeitig vom serverseitigen Cursor herunterzieht. Der von Ihnen verwendete Wert sollte die Anzahl der Netzwerkaufrufe im Verhältnis zur Speicherauslastung auf dem Client ausgleichen. Wenn Ihre Ergebniszahl beispielsweise drei Millionen beträgt, eine itersize
Der Wert 2000 (der Standardwert) führt zu 1500 Netzwerkaufrufen. Wenn der Speicherverbrauch von 2000 Zeilen gering ist, erhöhen Sie diese Zahl.
Bei Verwendung von for row in cursor
Sie arbeiten natürlich mit jeweils einer Zeile, aber Psycopg2 wird itersize
vorab abrufen Zeilen auf einmal für Sie.
Wenn Sie fetchmany
verwenden möchten Aus irgendeinem Grund könnten Sie so etwas tun:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
Diese Verwendung von fetchmany
löst keinen Netzwerkaufruf an den Server für weitere Zeilen aus, bis der vorab abgerufene Stapel erschöpft ist. (Dies ist ein kompliziertes Beispiel, das nichts über den obigen Code hinaus bietet, aber zeigt, wie man fetchmany
verwendet sollte Bedarf bestehen.)