Pointer auf Scripting.Dictionary

  • Ich denke du solltest mal ein konkretes Minimalbeispiel basteln wo wir sehen können welche Daten wie eingelesen werden und was danach mit ihnen gemacht wird.
    Wenn es z.B. nur ums einlesen geht wäre ein String das schnellste.
    Um darin aber Einträge zu suchen wären die anderen Datenstrukturen wiederrum besser.

    Ideal wäre also mal ein kleines Minimalbeispiel was auf das wesentliche beschränkt ist und wo deine Grundprobleme vorkommen.

    Übrigens: Dein Fazit das Sqlite bei 1e6 Einträgen langsamer ist als das Dictionary kann ich bei mir hier nicht reproduzieren.
    Bei mir ist die Hashtable etwa doppelt so schnell wie das Dictionary und die SQLite-Lösung wiederrum doppelt so schnell wie die Hashtable.

  • ???
    SQLite ist bei Dir also ca 4x schneller als das Dictionary?

    Hmm, da muss ich wohl nochmals über die Bücher!
    Danke für den Hinweis. Ich werde das nochmals genau anschauen müssen.

    Das mit dem Minimalbeispiel werde ich mir auch mal überlegen.
    Allerdings könnte sich dies schwierig gestalten, da mein Chef immer mal wieder die Anforderungen "geringfügig" ändert oder "Klitzekleine" Dinge dazukommen, welche aber auf das Programm teilweise sehr grossen Einfluss haben.

    Ich werde mir zuerst mal wieder alle Objekte (sicher Dictionary, Hash und SQLite) auf einem aktuellen Rechner vergleichen.
    Doch das wird etwas dauern, da in den nächsten Tagen andere Dinge bei mir wichtiger sind.

    Danke vorerst für diese Hilfe!

  • Ich konnte zwar auf die Schnelle die SQLite Methode noch massiv verschnellern, doch diese Methode hat dann wiederum drei Nachteile:
    1. Sie ist bei weniger als 600'000 Elementen langsamer als das Dictionary. Darüber ist sie z.T. massiv schneller
    2. Da alle Transaktionen in einem String gespeichert werden, ist natürlich die maximale Stringlänge in AutoIt massgebend! Man könnte natürlich nach XYZ Elementen wieder aufteilen, doch das braucht auch Zeit.
    3. Weil der String riesig werden kann, ist natürlich der RAM-Verbrauch entsprechend hoch.


    Hier der Testcode:
    Achtung, wenn man den laufen lässt, dauert es auf einem "normalen" Rechner schon 1-2 Minuten!

    Spoiler anzeigen
    [autoit]

    #include <SQLite.au3>
    Global $sSQLDLL = @TempDir & "\SQLite3.dll"
    FileInstall("SQLite3.dll", $sSQLDLL, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $iMax = 1e6
    Global $iTimer, $iEnd, $hDB, $aDatabase[$iMax][2], $sString = ""
    _SQLite_Startup($sSQLDLL, False, 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    $hDB = _SQLite_Open()
    _SQLite_Exec($hDB, "PRAGMA journal_mode = OFF;") ;No Journal = faster
    _SQLite_Exec($hDB, "PRAGMA synchronous = 0;") ;Don't wait for filesystem = faster
    _SQLite_Exec($hDB, "CREATE TABLE Source (Key, Item);") ;Create Table
    _SQLite_Exec($hDB, "BEGIN;") ;Begin of transactions => Faster!
    For $i = 0 to $iMax - 1
    _SQLite_Exec($hDB, "INSERT INTO Source VALUES ('" & $i & "', 'Teststring');")
    Next
    _SQLite_Exec($hDB, "End;") ;End of transactions => Faster!
    _SQLite_Close($hDB)

    [/autoit] [autoit][/autoit] [autoit]

    $iEnd = TimerDiff($iTimer)
    ConsoleWrite(StringFormat("SQLite: \t%7.1f ms\n", $iEnd))

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    $hDB = _SQLite_Open()
    _SQLite_Exec($hDB, "PRAGMA journal_mode = OFF;") ;No Journal = faster
    _SQLite_Exec($hDB, "PRAGMA synchronous = 0;") ;Don't wait for filesystem = faster
    _SQLite_Exec($hDB, "CREATE TABLE Source (Key, Item);") ;Create Table
    _SQLite_Exec($hDB, "BEGIN;") ;Begin of transactions => Faster!
    For $i = 0 to $iMax - 1
    $aDatabase[$i][0] = $i
    $aDatabase[$i][1] = "Teststring"
    Next
    For $i = 0 To $iMax - 1
    $sString &= "INSERT INTO [Source] VALUES ('" & $aDatabase[$i][0] & "', '" & $aDatabase[$i][1] & "');"
    Next
    _SQLite_Exec($hDB, $sString)
    _SQLite_Exec($hDB, "End;") ;End of transactions => Faster!
    _SQLite_Close($hDB)

    [/autoit] [autoit][/autoit] [autoit]

    $iEnd = TimerDiff($iTimer)
    ConsoleWrite(StringFormat("SQLite with Array:\t%7.1f ms\n", $iEnd))

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $oDictionary = ObjCreate("Scripting.Dictionary")
    If @error Or Not IsObj($oDictionary) Then Exit MsgBox(0,"Fehler", "Objekt konnte nicht erstellt werden")

    [/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    For $i = 0 To $iMax - 1
    $oDictionary.Add($i, "Teststring")
    Next
    $iEnd = TimerDiff($iTimer)
    ConsoleWrite(StringFormat("Dictionary: \t%7.1f ms\n", $iEnd))

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Shutdown()

    [/autoit]

    Einmal editiert, zuletzt von veronesi (11. September 2012 um 10:08)