150.000 SQLite-INSERTs beschleunigen
Bei Sprakit hatte ich das Problem, dass ich 150.000 Wikipedia-Artikel in eine SQLite-Datenbank eintragen musste (für Kroatisch, d.h. für Englisch oder Deutsch noch mehr). Mit einer normalen SQLite-Datenbank auf der Festplatte dauerte das mind. 1h - etwa so lange war ich weg und das Skript war immer noch nicht fertig.
Ein Ex-Kommilitone erklärte mir, dass ich die Datenbank in ein ramfs schieben solle, dort die Änderungen machen, und dann zurückschreiben - weil SQLite bei jeder Änderung auf die Festplatte zugreift, was natürlich langsam ist.
Ich habe kurzerhand mein Skript angepasst:
# Copy SQLite DB to RAM, so that insert is faster
tmpfile = tempfile.NamedTemporaryFile()
shutil.copy2(settings['sqlite'], tmpfile.name)
sqlite_conn = sqlite3.connect(tmpfile.name)
# do some real work
shutil.copy2(tmpfile.name, settings['sqlite'])
Bin aus dem Zimmer und das Skript war fertig… Innerhalb von etwa 1-2 Minuten.
Ich habe absichtlich tempfile.NamedTemporaryFile()
verwendet, um das Skript plattformunabhängig zu halten. Natürlich ist es damit nur auf Systemen schnell, auf denen der temporäre Ordner, den Python verwendet (bei mir /tmp
) im RAM liegt.