SQLite-Datenbank vs. Textfile und Array

  • DIE FRAGE: WAS IST BESSER (SCHNELLER) DATENSUCHE...
    ...IM ARRAY ÜBER FILEREADTOARRAY UND ARRAYSEARCH
    ODER
    ...SQLITE_QUERYSINGLEROW BEI SQLITE-DATENBANK?


    Mein aktuelles Projekt umfasst folgende Schritte:


    • "Scannen" diverser WEB-Seiten
    • Auslesen und Aufbereiten der Inhalte
    • Bereitstellung dieser als ASCII del. für Folgearbeiten z.B. mit ACCESS


    Bei Schritt 2 soll neu zusätzlich auf Daten früherer "Scanläufe" (zur Vermeidung ressourcenfressender Doppelerfassungen und für eine vereinfachte Nutzung der Ergbnisdaten) zugeriffen werden.

    Bevor ich viel Zeit in die Suche nach der besten (performantesten) Lösung investiere, meine Frage an die AutoIt-Mitglieder nach der besseren Variante. Hier meine beiden Ideen:


    • Nutzung der bestehenden ASCII del. aus früherem Scan per _FileReadToArray und Suche nach PK-Merkmalen mit _ArraySearch

      ODER

    • Verwendung einer SQLite-Datenbank, die bei jedem Lauf fortgeschrieben wird und Abfrage ggf. vorhandener PK-Merkmale per _SQLite_QuerySingleRow. Eine Nutzung von _SQLite_SQLiteExe sollte dabei nicht erfolgen, da das Tool auch ohne installiertes SQLite arbeiten soll, d.h. nur mit SQLite.dll.au3.


    Tests im kleinen Rahmen (nur ca. 1.000 Datensätze) zeigten einen klaren Zeitvorteil bei der Array-Lösung. Ich kann die Laufzeiten bei angenommenen 500.000 oder mehr Datensätzen aber vermutlich damit nicht gleichsetzen.

    Welche Lösung (bzw. welche vielleicht noch bessere) ist die bessere?


    Anmerkungen:
    PK-Merkmal = Primary Key = Identifer für den jeqweiligen Datensatz

  • Also ich hab mal was vergleichbares gemacht und mich für SQLite entschieden.
    Ich habs nicht bereut, letztlich ist die Lösung einfacher und man kann bequem grosse Datenmengen handhaben.
    Ein SQL Query ist doch allemal lesbarer als irgendein Jonglieren mit Arrays, oder ?
    Die Geschwindigkeit war nicht übel, dafür hat man ja schliesslich eine Datenbank.

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Ich schließe mich ohforf an....

    Bei den Arrays wird immer die ganze Datei eingelesen, was (meines Wissens nach) bei SQL nicht der fall ist...somit wir die performance bei extrem vielen daten wesentlich einfacher! Außerdem lässt sich in einer SQL-Datenbank auch viel einfacher Ordnung halten, durch die verschiedenen Felder hast du dann schnellen Zugriff auf die für dich relevanten Daten...zB Url, Datum, Quellcode etc...

    Grüße

  • Meine Frage begründete sich in dem erheblichen Performancevorteil der beschriebenen Array-Variante mit einem kleinen Testdatenbestand. Ich habe nun nochmals einen größeren Datenbestand generiert und die Abfragezeiten -unter Berücksichtigung der Position des abgefragten Wertes innerhalb der DB-Tabelle/ Liste- analysiert.

    Danke jedenfalls für die schnellen Antworten, Eure Meinung bestätigt sich in den Zahlen: :thumbup:

    Zeitmittelwerte mehrerer Testabfragen verschiedener Werte bei ca. 60.000 Datensätzen:
    > SQLite: 39 Millisekunden
    > Array: 337 Millisekunden

    Auffällig ist jedoch, dass sich jeweils beim Erstzugriff auf die SQLite-DB eine erheblich längere Zugriffszeit (ca. die 5-fache Zeit aller weiteren Abfragen der "Versuchsreihe") ergab, obschon die DB jeweils wieder geschlossen wurde. :?:

  • Ich möchte diesen Beitrag nun selbst zu einem guten Ende verhelfen...

    Nach zahlreichen Versuchen und Suche im WWW steht der klare Sieger fest: SQLite.
    Meine anfänglichen Bedenken konnte ich nach etwas Feintuning selbst ausräumen. Sehr hilfreich (und deshalb hier für alle) fand ich die Optimierungstipps von Jim Lyon (siehe: http://web.utk.edu/~jplyon/sqlite…zation_FAQ.html).

    EInen unglaublichen Performancegewinn brachten bei mir folgende Details:
    > _SQLite_Exec(-1,"PRAGMA journal_mode = OFF;") = keine Journalschreibung
    > _SQLite_Exec(-1,"PRAGMA synchronous = 0;") = kein "Warten" aufs Dateisystem
    > _SQLite_Exec(-1,"begin;") ... alle Transaktionen ... _SQLite_Exec(-1,"commit;") = alle Zugriffe sozusagen in einem "Paket"
    > und Verzicht auf Indizierung bei umfangreichen insert-Befehlen (lieber Index löschen und zuletzt neu generieren)

    Allein diese "Kleinigkeiten" beschleunigten mein Skript auf weniger als die Hälfte der Laufzeit mit "normaler" SQLite-Nutzung!

    Aber: Verwendung auf eigene Gefahr bzw. Fehlerbehandlung bei Abbruch innerhalb von Transaktionen beachten!