Psycopg2 belegt Speicher für große Auswahlabfragen

8

Ich verwende psycopg2, um eine Postgresql-Datenbank abzufragen und zu versuchen, alle Zeilen aus einer Tabelle mit etwa 380 Millionen Zeilen zu verarbeiten. Es gibt nur 3 Spalten (id1, id2, count) vom Typ integer. Wenn ich jedoch die einfache Select-Abfrage unten ausführe, beginnt der Python-Prozess mehr und mehr Speicher zu verbrauchen, bis er vom Betriebssystem zerstört wird.

Minimales funktionierendes Beispiel (unter der Annahme, dass mydatabase existiert und eine Tabelle mit dem Namen mytable enthält):

%Vor%

An diesem Punkt beginnt das Programm, Speicher zu verbrauchen.

Ich habe es mir angesehen und der Postgresql-Prozess verhält sich gut. Es verwendet ein gutes Stück CPU, was in Ordnung ist, und eine sehr begrenzte Menge an Speicher.

Ich habe erwartet, dass psycopg2 einen Iterator zurückgibt, ohne zu versuchen, alle Ergebnisse aus der Auswahl zu puffern. Ich könnte dann cur.fetchone() wiederholt verwenden, um alle Zeilen zu verarbeiten.

Also, wie wähle ich aus einer 380-m-Reihentabelle aus, ohne den verfügbaren Speicher zu verbrauchen?

    
Carl 05.02.2015, 11:51
quelle

2 Antworten

12

Sie können serverseitige Cursor verwenden.

%Vor%     
bav 05.02.2015, 11:55
quelle
0

Eine weitere Möglichkeit, serverseitige Cursor zu verwenden:

%Vor%

Psycopg2 ruft itersize Zeilen gleichzeitig zum Client ab. Sobald die for -Schleife diesen Stapel erschöpft, wird der nächste abgerufen.

    
Demitri 11.02.2018 18:52
quelle

Tags und Links