Ich analysiere gerade eine Wikipedia-Dump-Datei; Ich extrahiere eine Reihe von Daten daraus mit Python und behalte es in einer PostgreSQL-Datenbank. Ich versuche immer, die Dinge schneller zu machen, weil diese Datei riesig ist (18 GB). Um mit PostgreSQL zu interagieren, verwende ich psycopg2, aber dieses Modul scheint viele andere solche DBAPIs nachzuahmen.Python-PostgreSQL psycopg2 Schnittstelle -> Executemany
Wie auch immer, ich habe eine Frage bezüglich cursor.executemany (Befehl, Werte); es scheint mir, als würde man eine Executemany einmal alle 1000 Werte ausführen oder so ist es besser als cursor.execute (command% value) für jeden dieser 5 Millionen Werte aufzurufen (bitte bestätigen oder korrigieren Sie mich!).
Aber Sie sehen, ich verwende eine Executemany, um 1000 Zeilen in eine Tabelle einzufügen, die eine UNIQUE Integritätsbedingung hat; Diese Einschränkung wird vorher nicht in Python verifiziert, da ich entweder ständig SELECT (das scheint kontraproduktiv) oder mehr als 3 GB RAM benötige. All dies zu sagen, dass ich auf Postgres zu warnen, um mich zu warnen, als mein Skript versucht, eine bereits vorhandene Zeile durch Abfangen der psycopg2.DatabaseError einzufügen.
Wenn mein Skript eine solche nicht eindeutige INSERT erkennt, es connection.rollback() (was macht bis zu 1000 Zeilen jedes Mal, und macht die Executemany wertlos) und fügt dann alle Werte nacheinander ein.
Da psycopg2 so schlecht dokumentiert ist (wie so viele große Module ...), kann ich keine effiziente und effektive Problemumgehung finden. Ich habe die Anzahl der INSERT-Werte pro Executemany von 1000 auf 100 reduziert, um die Wahrscheinlichkeit eines nicht eindeutigen INSERT pro Executemany zu reduzieren, aber ich bin mir ziemlich sicher, dass sie psycopg2 einfach sagen können, diese Exceptions zu ignorieren oder das zu sagen Cursor, um die Ausführung fortzusetzen.
Im Grunde scheint dies die Art von Problem, die eine so einfache und beliebte Lösung hat, dass ich nur fragen kann, um darüber zu lernen.
Danke nochmal!
Ich bin mir nicht sicher, aber ich denke, Executemany iteriert nur über Ihre Liste von Wörterbüchern (Zeilen) und ruft "Einfügen" auf jedem. Es macht also keinen Unterschied, ob Sie in einer Schleife ausführen oder Executemany aufrufen. Nur dass das "commit" nicht in loop aufgerufen werden sollte, sondern alle 100 oder 1000 mal. –
so ist es: outerloop-> bekommt 1000 nächste Zeilen von der Liste -> gibt innere Schleife -> für jeden ausführen -> innere Schleife Exits -> commit -> Outerloop weiter bis Daten dauert. Sie können es auf einem 100.000 Datensatz gegen die Excutemany ausprobieren und prüfen, ob es einen Unterschied macht. –
JV, also Sie sagen, dass eine ausführbare IPC kommuniziert mit PostgeSQL für jeden INSERT? Es ist der Overhead, der IPC innewohnt, den ich durch die Verwendung von Executemany zu beseitigen hoffe; wenn es das nicht beseitigt, habe ich nicht genug Grund, es zu benutzen. Danke, aber ich brauche noch mehr Überzeugung! -Nick –