Ich schreibe ein Programm zum Laden von Daten in eine bestimmte Datenbank. Das ist, was ich jetzt tue ...Geschwindigkeit Verbesserung in Postgres INSERT Befehl
conn = psycopg2.connect("dbname='%s' user='postgres' host='localhost'"%dbName)
cur = conn.cursor()
lRows = len(rows)
i, iN = 0, 1000
while True:
if iN >= lRows:
# write the last of the data, and break ...
iN = lRows
values = [dict(zip(header, r)) for r in rows[i:iN]]
cur.executemany(insertString, values)
conn.commit()
break
values = [dict(zip(header, r)) for r in rows[i:iN]]
cur.executemany(insertString, values)
conn.commit()
i += 1000
iN += 1000
cur.close()
conn.close()
Ich bin mir bewusst über this Frage über die Verwendung des COPY
Befehl. Bevor ich die Dateien in eine Datenbank hochladen kann, muss ich jedoch eine Buchhaltung für meine Dateien erstellen. Daher benutze ich Python auf diese Weise.
Ich habe ein paar Fragen, wie schneller machen Dinge ...
- Wäre es besser (oder möglich), viele
cur.executemany()
Aussagen und eine einzigesconn.commit()
am Ende zu tun? Das bedeutet, dass ich eine einzelneconn.commit()
Aussage kurz vor dercur.close()
Anweisung setzen. - Ich habe immer andere Leute benutzen gesehen
cur.executemany()
für Chargen wie 1000 oder so Aufzeichnungen. Ist das in der Regel der Fall oder ist es möglich, einfach einencur.executemany()
für die gesamte Menge von Datensätzen zu machen, die ich aus der Datei gelesen habe. Ich hätte möglicherweise Hunderttausende Datensätze oder vielleicht etwas mehr als eine Million Datensätze. (Ich habe genügend RAM, um die gesamte Datei im Speicher zu speichern). Wie kann ich die obere Grenze der Anzahl der Datensätze kennen, die ich gleichzeitig hochladen kann? - Ich mache eine neue Verbindung zur Datenbank für jede Datei, die ich öffne. Ich mache das, weil dieser Prozess mich viele Tage braucht, um abzuschließen, und ich möchte nicht, dass Probleme mit der Verbindung die Gesamtheit der Daten beschädigen, wenn die Verbindung zu irgendeinem Zeitpunkt verloren ist. Ich habe über tausend Dateien, die ich durchlaufen muss. Sind diese tausend Verbindungen, die wir machen, ein wesentlicher Teil der Zeit, die für den Prozess benötigt wird?
- Gibt es noch andere Dinge, die ich im Programm mache, die ich nicht tun sollte, die die gesamte Zeit für den Prozess verkürzen können?
Vielen Dank für jede Hilfe, die ich bekommen kann. Entschuldige, dass die Fragen so grundlegend sind. Ich beginne gerade mit Datenbanken in Python, und aus irgendeinem Grund scheint es mir momentan keine definitive Antwort auf diese Fragen zu geben.