2017-12-13 6 views
1

Ich schrieb ein Skript in python, das eine Verbindung zu einer Datenbank unter Verwendung psycopg herstellt. Ich arbeite mit zwei Tabellen in der gleichen Datenbank. Zuerst führe ich eine select * from table_1 und danach überprüfe ich, ob jede Zeile (fetchone) einige Anforderungen erfüllt. Wenn dies der Fall ist, wird eine neue Zeile in Tabelle 2 mit einer INSERT erstellt. Der Code sieht ähnlich wie:Threading innerhalb eines Cursors in psycopg2

cursor_1 = conn.cursor() 
cursor_2 = conn.cursor() 

cursor_1.execute("SELECT * FROM table_1") 
for i in range(1,n): 
    a = cursor_1.fetchone() 
    if (condition_in_a): 
     cursor_2.execute("INSERT into table_2 (f1,f2) values (v1,v2)") 

Das Skript läuft in einer sequentiellen for Schleife und ich wollte wissen, ob es ein besserer Weg, um diese Aufgabe durch psycopg2.pool in Bezug auf Leistung zu erreichen. Also meine Frage ist: Ist es möglich, einen psycopg Cursor Multithread? Wenn nicht, was wäre der beste Ansatz, um eine bessere Leistung zu erzielen?

Vielen Dank im Voraus.

Antwort

1

In einem Single-Thread-Ansatz versuchen Sie, das Verhältnis zwischen Speichernutzung und Zeilenverarbeitungsgeschwindigkeit zu halten. fetchone Senken Sie die Speichernutzung, benötigen jedoch mehr Arbeit zum Abrufen der Daten. für große Datasets verwenden große Speichermengen und das Laden von Daten kann einige Zeit dauern, bevor die Verarbeitung gestartet wird.

So, zumindest, ist eine bessere Möglichkeit, Daten durch kleinere Teile mit zu holen. Der folgende Generator kann einen Prozess vereinfachen:

def ResultIter(cursor, limit=100): 
    while True: 
     results = cursor.fetchmany(limit) 
     if not results: 
      break 
     for result in results: 
      yield result 

Basierend auf diesem Ansatz, den Sie auch Multithreading-Verarbeitung implementieren können, aber ich bin wirklich nicht sicher über die Leistung.

Verwandte Themen