Parser in C - Welche Technik ist die beste?
-
hallo,
ich würde gerne einen ini-Parser in c programmieren.
Ich habe mir bereits einige quellcodes angeschaut, und dabei mehrere techniken bemerkt.
1. die datei wird geladen, danach analysiert, es wird ein "dictionary" erstellt und gefüllt, dazu wird von jedem eintrag mit einem speziellen algorithmus ein hash erstellt. wenn ich etwas in diesem dictionary suche will, dann wird vom gegebenen string der hash-wert gebildet, und jeder hash im wörterbuch mit diesem verglichen.
2. nicht analysieren, einfach jede zeile nach gewünschter value durchsuchen?!?
wie genau machen das komplexere parser (z.b. xml-parser)? werden die datei sofort analysiert und ein solches dictionary erstellt?
-
Das Problem ist, wenn man die ganze Datei im Speicher hat, dass der Speicherplatz evtl. nicht ausreicht.
Wenn man eine Gigabyte-Datei komplett im Speicher mit sich herumschleppt, ist das nicht gerade gut für die Perfomance.
Die zweite Methode ist allerdings langsam.
Ich würde einen Mittelweg wählen.
Anstatt die values und keys selber zu speichern, speichere ich nur die Position in der Datei, in der der key ist. Wird der benötigt lese ich den dazu gehörigen (= in der gleichen Zeile befindlichen) value ein.
-
Ini Dateien werden sicher nicht mehrere GB groß. Machs nicht zu kompliziert. Wenn du auf die Werte öfter zugreifen willst, kannst du schon einen Hash erstellen, aber das wäre eine optionale interne Optimierung.
Ein Parser analysiert nichts und hasht nichts, das machen übergeordnete Klassen. Und das kommt drauf an, was die Klasse mit den Daten machen will.
-
ok, weißt du zufällig auch, wie libxml funktioniert?
-
kartoffel schrieb:
1. die datei wird geladen, danach analysiert, es wird ein "dictionary" erstellt und gefüllt, dazu wird von jedem eintrag mit einem speziellen algorithmus ein hash erstellt. wenn ich etwas in diesem dictionary suche will, dann wird vom gegebenen string der hash-wert gebildet, und jeder hash im wörterbuch mit diesem verglichen.
Oder sogar anhand des Hash-Wertes wird der Array-Index berechnet (z.B. einfach modulo Tabellengröße), wo dieser Key liegen *müsste*. Und beim Suchen wird dann genau dort gestartet und nur soweit gesucht, bis ein leerer Array-Feld kommt (und das nächste Freie kommt erstaunlich schnell). Abgelegt wird auch genau dort bzw im nächsten freien Feld. Dazu müssen natürlich ausreichend viele leere Plätze existieren, so 20 bis 50 Prozent wären supi.
-
also ist es jetzt doch so, dass der zu parsende code analysiert und im dictionary gespeichert wird?
-
also doch dictionary? schrieb:
also ist es jetzt doch so, dass der zu parsende code analysiert und im dictionary gespeichert wird?
Hängt davon ab, ob Du der Thread-Ersteller bist oder ein fremder Frager.