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.

I do not maintain a comments section. If you have any questions or comments regarding my posts, please do not hesitate to send me an e-mail to blog@stefan-koch.name.