Seite 1 von 2

Strings schneller verarbeiten

Verfasst: 26.06.2020 17:33
von Jac de Lad
Hallo,
ich bin noch in der Einarbeitung und hab ein Allerweltsproblem, aber vielleicht kann mir jemand helfen. Ich lese eine größere Menge Log-Dateien aus und verarbeite einige ausgewählte Einträge daraus (mit einige meine ich einige 100000). Die Einträge werden gekürzt und aufbereitet und anschließend in eine andere, nun kleinere, Datei geschrieben, damit sie später weiterverwendet werden können. Lange Rede, kurzer Sinn: Wenn ich die Werte anschließend verarbeiten will wird mein Programm zur Unendlichkeitsmaschine. Das Problem ist, dass ich einen Teil jedes Eintrags zu einem String zusammenführe ("Eintrag1|Eintrag2|Eintrag3|etc."), der dann natürlich echt lang wird. Mir ist klar, dass die Verarbeitung dadurch wortwörtlich ins Bodenlose stürzt (wenn ich die Zeile ausklammere sind es nur noch Millisekunden). In der Theorie könnte man natürlich eine Liste oder etwas anderes verwenden, aber vielleicht hat noch jemand eine weitere Idee. Ein weiteres Problem ist, dass nicht nur einer dieser Strings besteht sondern mehrere gecacht werden. Also bräuchte ich dann noch eine Verwaltung für die eventuellen Listen. Ob ich im Nachhinein die Werte aus einer Liste auslese oder mit StringField verarbeite ist mir relativ wurscht. Das langsamste ist eindeutig die ständige Erweiterung des Strings. Meine direkte Frage:
Ich nutze eine Map, der String ist momentan in dem Eintrag "MapName(Programmname)\Einzelwerte" gespeichert. Kann ich stattdessen auch für "Einzelwerte" die Adresse einer Liste speichern und verwenden und wird das schneller? Ich müsste dann für jedes Programm eine Liste erstellen, die Adresse in der Map speichern und kann dann darauf zugreifen (jedenfalls stelle ich es mir so vor). Ist das schneller und geht das überhaupt? Kennt vielleicht jemand noch eine schnellere Lösung?

Ich hoffe ich konnte mich richtig ausdrücken,
Jac

Re: Strings schneller verarbeiten

Verfasst: 26.06.2020 18:33
von NicTheQuick
Meinst du sowas?

Code: Alles auswählen

Structure Programm
	List Einzelwerte.s()
EndStructure

Global NewMap Programme.Programm()

Procedure addEinzelwert(programm.s, wert.s)
	If FindMapElement(Programme(), programm)
	ElseIf AddMapElement(Programme(), programm)
	Else
		Debug "Fehler"
	EndIf
	If Not AddElement(Programme()\Einzelwerte())
		Debug "Fehler"
	EndIf
	Programme()\Einzelwerte() = wert
EndProcedure

addEinzelwert("command.exe", "wert1")
addEinzelwert("command.exe", "wert2")
addEinzelwert("explorer.exe", "datei1")
addEinzelwert("explorer.exe", "datei2")
addEinzelwert("command.exe", "wert3")

ForEach Programme()
	Debug "Programm: " + MapKey(Programme())
	ForEach Programme()\Einzelwerte()
		Debug "Wert: " + Programme()\Einzelwerte()
	Next
Next

Re: Strings schneller verarbeiten

Verfasst: 26.06.2020 19:10
von Jac de Lad
Ja, ich glaube das meine ich. Ich kann also innerhalb meiner Map direkt eine Liste anlegen? Und das ist schneller? Bleibt die Reihenfolge erhalten (das ist wichtig)? Ich teste es gleich aus.

Vielen Dank schonmal.

Re: Strings schneller verarbeiten

Verfasst: 26.06.2020 19:35
von NicTheQuick
Bei Listen bleibt die Reihenfolge immer erhalten. Bei Maps nicht, weil die intern anders funktionieren.

Re: Strings schneller verarbeiten

Verfasst: 26.06.2020 19:54
von Jac de Lad
Vielen Dank, klappt wunderbar. Da war ich schon auf dem rechten Weg, aber auf die Idee, die Liste direkt in die Struktur einzubauen, wäre ich nicht gekommen.

Nachtrag: Jetzt klappen auch die Folgenfunktionen viel schneller. TOP!

Re: Strings schneller verarbeiten

Verfasst: 26.06.2020 20:05
von Kiffi
NicTheQuick hat geschrieben:

Code: Alles auswählen

Procedure addEinzelwert(programm.s, wert.s)
	If FindMapElement(Programme(), programm)
	ElseIf AddMapElement(Programme(), programm)
	Else
		Debug "Fehler"
	EndIf
	If Not AddElement(Programme()\Einzelwerte())
		Debug "Fehler"
	EndIf
	Programme()\Einzelwerte() = wert
EndProcedure
geht auch so:

Code: Alles auswählen

Procedure addEinzelwert(programm.s, wert.s)
   AddElement(Programme(programm)\Einzelwerte())
   Programme(programm)\Einzelwerte() = wert
EndProcedure

Re: Strings schneller verarbeiten

Verfasst: 26.06.2020 21:06
von Jac de Lad
Danke Peter, so habe ich es auch schon gelöst. Vorher 520 Sekunden, jetzt <2, LOL, dämliche Strings. :lol:

Re: Strings schneller verarbeiten

Verfasst: 26.06.2020 22:42
von NicTheQuick
Kiffi hat geschrieben:

Code: Alles auswählen

Procedure addEinzelwert(programm.s, wert.s)
   AddElement(Programme(programm)\Einzelwerte())
   Programme(programm)\Einzelwerte() = wert
EndProcedure
Hm, okay. Aber überprüfst du wirklich nie den Rückgabewert von AddElement()? Ich mache das nämlich immer. Mit Maps arbeite ich hingegen kaum. Ich war mir nicht sicher, ob das Verhalten so genau gleich ist.

Re: Strings schneller verarbeiten

Verfasst: 26.06.2020 23:00
von Kiffi
NicTheQuick hat geschrieben:Aber überprüfst du wirklich nie den Rückgabewert von AddElement()?
ja, da hast Du Recht. Sollte man eigentlich machen. Mir würde Speicherknappheit als Grund einfallen, warum AddElement() nicht klappen sollte. Ist das bei Dir schon mal aufgetreten?

Re: Strings schneller verarbeiten

Verfasst: 27.06.2020 00:43
von mk-soft
Prüfe ich nur wenn es um sehr große Datenmengen geht ...