Liste durchsuchen und performance

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hallo Leute,
ich durchsuche eine Datenbank nach Datensätzen, bereite diese später auf und schreibe diese in eine Datei.

Ich hatte Anfangs das Problem, dass es vom Start bis zur geschriebenen 200kB großen Datei rund 10 Sekunden gedauert hat. Ich hab damals angenommen, dass es an den extrem vielen MySQL Abfragen liegt (Mein Vorarbeiter hat für jede Zeile dieser Datei rund 8 MySQL Abfragen gemacht).

Also habe ich das alles mit JOINS und so in nur 8 Abfragen gepackt und in Listen gespeichert, die ich dann in Python durchsuche.
Das klappt auch für das obere Beispiel ganz gut, erhalte meine Datei in rund 4 Sekunden.

Mein Problem ist jetzt, wenn die Dateien die geschrieben werden größer werden, dann dauert das Suchen in meiner Liste viel zu lange. Eine Datei mit rund 1MB dauert jetzt schon 1 Minute.

Ich hab diese Listen mit listcomprehension durchsucht, also in etwa eine solche Struktur:

Code: Alles auswählen

[[model_key,model_id] for model_key,model_id in obj['model'] if model_key == int(obj['model_key'])]
Und das ist bei großen Listen (>30000) keine gute Lösung.

Kann mir hier jemand Tipps geben?
Ich habe halt die gleichen Keys, wie ich sie auch in der Datenbank habe. Kann ich da irgendwie effizienter suchen?
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Warum suchst du nicht schon in der Datenbank? Beschreibe doch mal bitte das gesamte Problem (inklusive deiner SQL-Joins)
Bottle: Micro Web Framework + Development Blog
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Also, ich versuch es mal ein wenig genauer zu beschreiben, ist recht Komplex.

Ich hab in meiner Datenbank Tabellen: Model, Molecule, Residue, Atom (sind noch ein paar mehr, aber das reicht zum erklären.)

Mein Vorgänger hat für einen Eintrag alle Modelle rausgesucht, danach für jeden Model alle Moleküle, für jedes Molekül die Residues und dann für alle Residues die Atome, also eine vierfach Verschachtelte Schleife in der dann jedes einzelne Atom nochmal mit einer MySQL Abfrage "geholt" wird.

Ich bin hingegangen und habe nur 4 Anfragen gemacht:
Alle Modelle für einen Eintrag,
alle Moleküle für einen Eintrag,
alle Residues für einen Eintrag und dann noch
alle Atome für einen Eintrag.

Somit habe ich nur 4 MySQL Abfragen, weil ich dachte, hier ist der Flaschenhals.

Jetzt ist halt das Problem, das die gleichen Forschleifen auf meinen Lokalen listen ausführe und das für kleine Listen auch schneller ist, aber eben für große Listen extrem langsam wird.

Wenn ich jetzt Code posten soll, das sind rund 500 Zeilen... Weiß nich ob das was bringt.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Und was soll am Schluss in der Zieldatei stehen? Wie sieht das Ziel-Dateiformat aus?

Grob geraten vermute ich, das man alles mit einem einzigen SQL Join lösen könnte, da du anscheinend alle 4 Datentypen direkt zusammen joinen kannst. Das macht deutlich mehr Sinn, als die komplette Datenbank vorher in den Python-Speicher zu laden.
Bottle: Micro Web Framework + Development Blog
Antworten