Geschwindigkeit JSON UDF

  • Hallo in die Runde,

    ich nutze das m.E. sehr wertvolle JSON UDF von AspirinJunkie um eine strukturell umfangreiche verschachtelte Mapstruktur zu verarbeiten. Vom Datenumfang ist die Struktur eher nicht groß, siehe "zip" - Anhang.

    Das Erzeugen derselbigen ist von der Zeit hier noch erträglich, aber beim Einlesen in ein anderes Skript rechnet er sich einen Wolf. Ich habe es nach ca. einer halben Stunde angebrochen, weil es so nicht praktikabel ist für mich.

    Gibt es Ideen das zu beschleunigen? Es wäre schade wenn ich wieder auf ein Gefrikel über das Dateisystem und viele CSV-Dateien zurück kehren müsste, weil vom Prinzip her sind die AU3 maps in Verbindung mit JSON schon genial.

    Beste Grüße

    Code
    Func JsonOut($jfile)
        writeln("> Schreibe ",$jfile)
        FileDelete($jfile)
        FileWrite($jfile,_JSON_Generate($JsonIn))
    EndFunc
    Func JsonIn($jfile)
        writeln("> Lese ",$jfile)
        Local $OutPut = FileRead($jfile)
        $JsonIn = _JSON_Parse($OutPut)
    EndFunc
  • Ich kann dein Problem nicht reproduzieren.
    Die angehangene Datei "Rubber.json" wird bei mir in 1,6s eingelesen.

    Um das offensichtlich bei dir vorhandene Problem zu ergründen benötigen wir nun ein Minimalskript, welches das von dir beschriebene Verhalten reproduziert (nein - das bisher gepostete ist kein Minimalskript - es sind nur 2 Funktionen), sowie die tatsächlichen Daten mit der das Problem auftritt.
    Dass du die aktuelle Version der UDF verwendest, setze ich mal als gegeben voraus.

    Btw: In der JSON-Datei meine ich ein Problem mit den Datentypen zu sehen: Offensichtliche numerische Werte wie 3.245038e+01 sind in der JSON-Datei als Stringtyp hinterlegt (in Anführungszeichen).
    Da die _JSON_Generate() nicht einfach aus numerischen Typen Strings bastelt, muss der falsche Datentyp bereits in den Ausgangsdaten vorhanden sein.


    Edit: Oder noch viel wichtiger: Welche Version von AutoIt verwendest du?
    In Version 3.16.0 wurde ein Bug in StringRegExp gefixt, welcher insbesondere Mehrfachaufrufe von großen Strings enorm ausgebremst hat.
    Das war insbesondere für die UDF hier tödlich.
    Heißt: Mit allen älteren Versionen sollte das von dir beschriebene Verhalten auftauchen.

    2 Mal editiert, zuletzt von AspirinJunkie (24. Januar 2024 um 13:01)

  • Ich kann dein Problem nicht reproduzieren.
    Die angehangene Datei "Rubber.json" wird bei mir in 1,6s eingelesen.

    Um das offensichtlich bei dir vorhandene Problem zu ergründen benötigen wir nun ein Minimalskript, welches das von dir beschriebene Verhalten reproduziert (nein - das bisher gepostete ist kein Minimalskript - es sind nur 2 Funktionen), sowie die tatsächlichen Daten mit der das Problem auftritt.
    Dass du die aktuelle Version der UDF verwendest, setze ich mal als gegeben voraus.

    Meine Konfiguration hier ist was exotisch, gelinde gesagt. Ich arbeite unter Ubuntu 20 LTS und der neusten stabilen WINE Ausführungsschicht, auf einem alten Dualcore-PC (4GB RAM und 3,6Ghz). Ich merke aber oft kaum bis wenig Performance Verluste bei AU3 Scripten zu modernen Maschinen unter Windows 10/11.

    Trotzdem danke für den Hinweis, sehr wahrscheinlich liegt es nicht am UDF sondern irgendwo anderes. Nach der Programmierung eines Minimalen-Skript läuft es ca. 57sec., was erträglich ist.

    AutoIt
    #include "JSON_Dictionary.au3"
    #include <Array.au3>
    Global $jfile  = "O:\archiv\prg\prg\walkowiak\DMA\dm2\vergleich012JSON\Rubber.json"
    Global $InPut = FileRead($jfile)
    Global $JsonIn = _JSON_Parse($InPut)
  • Schau mal meinen Edit oben bezüglich der AutoIt-Version an.
    Die JSON_Dictionary wird im übrigen seit einiger Zeit nicht mehr gepflegt.
    Da du aber eh Maps verwenden wolltest, verstehe ich nicht, warum du diese anstatt der JSON.au3 nimmst.

  • Ich glaube ich habe die Fehler zumindest so eingekreist nämlich, dass es ein meinen UDFs liegt. Wenn ich alle meine UDFs +JSON.au3 einbinde dann läuft es in 8160sec durch, und wenn nur Deine JSON UDF geladen wird dann dauert es für mich akzeptable 50sec. So Seiteneffekte hatte ich noch nie in AU3, zumal es keine Fehlermeldung gibt, die man erwarten würde, wenn dich die UDFs irgendwie in die Quere kämen.

    Mir erscheint es sinnvoll die UDFs auszublenden die ich nicht brauche, aber doof ist es schon weil alles Einbinden ist schon viel bequemer.


  • Ich finde die 50s aber schon ziemlich heftig.
    Die sind meiner Meinung nach auch viel zu lange.
    Ob das am Zugriff über Wine liegt - keine Ahnung.
    Aber eine Antwort auf meine Frage ob du die aktuelle Version von AutoIt verwendest steht noch aus.

  • AspirinJunkie Hallo nochmal, nach stundenlangem suchen ist es mir gelungen die Ursache auf meinem System zu finden, und zwar war in einer selbstgefrickelten uralt UDF.

    AutoItSetOption ( "ExpandEnvStrings", 1)

    gesetzt, was bei mir augenscheinlich dafür sorgt, dass das Deine UDF SEHR langsam wird. Wenn man das heraus nimmt läuft es.

    Nun braucht es unter WINE auf dem alten PC ca. 50sec. statt 8160sec., und unter Windoof 10 auf einem mittelalten I7 3,7sec.

    Damit kann ich leben, und bedanke mich für Deine Hilfe und das sehr brauchbare JSON UDF!

  • Ich finde die 50s aber schon ziemlich heftig.
    Die sind meiner Meinung nach auch viel zu lange.
    Ob das am Zugriff über Wine liegt - keine Ahnung.
    Aber eine Antwort auf meine Frage ob du die aktuelle Version von AutoIt verwendest steht noch aus.

    WINE is not Windows, und mit einer Hardware von 2008 da passt das schon. Und ja, man muss ja wenn man die maps nutzt die neuste Version von AU3 nutzen, sonst kommt man wahrscheinlich in Teufelsküche.

    OT: Seite dem Ende von Windows 7 nutze ich fast konsequent Linux, und vermisse außer autoit in dieser Welt eigentlich nichts. Oder anderes herum gesagt, autoit wäre wenn ich es in Verbindung mit .NET nutzen würde, eigentlich der Grund bei Windows zu bleiben.