Strings schneller verarbeiten
- Jac de Lad
- Beiträge: 56
- Registriert: 24.07.2019 17:53
- Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
- Wohnort: Riesa
- Kontaktdaten:
Strings schneller verarbeiten
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
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
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Strings schneller verarbeiten
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
- Jac de Lad
- Beiträge: 56
- Registriert: 24.07.2019 17:53
- Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
- Wohnort: Riesa
- Kontaktdaten:
Re: Strings schneller verarbeiten
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.
Vielen Dank schonmal.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Strings schneller verarbeiten
Bei Listen bleibt die Reihenfolge immer erhalten. Bei Maps nicht, weil die intern anders funktionieren.
- Jac de Lad
- Beiträge: 56
- Registriert: 24.07.2019 17:53
- Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
- Wohnort: Riesa
- Kontaktdaten:
Re: Strings schneller verarbeiten
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!
Nachtrag: Jetzt klappen auch die Folgenfunktionen viel schneller. TOP!
Re: Strings schneller verarbeiten
geht auch so: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
Code: Alles auswählen
Procedure addEinzelwert(programm.s, wert.s)
AddElement(Programme(programm)\Einzelwerte())
Programme(programm)\Einzelwerte() = wert
EndProcedure
a²+b²=mc²
- Jac de Lad
- Beiträge: 56
- Registriert: 24.07.2019 17:53
- Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
- Wohnort: Riesa
- Kontaktdaten:
Re: Strings schneller verarbeiten
Danke Peter, so habe ich es auch schon gelöst. Vorher 520 Sekunden, jetzt <2, LOL, dämliche Strings. 

- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Strings schneller verarbeiten
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.Kiffi hat geschrieben:Code: Alles auswählen
Procedure addEinzelwert(programm.s, wert.s) AddElement(Programme(programm)\Einzelwerte()) Programme(programm)\Einzelwerte() = wert EndProcedure
Re: Strings schneller verarbeiten
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?NicTheQuick hat geschrieben:Aber überprüfst du wirklich nie den Rückgabewert von AddElement()?
a²+b²=mc²
Re: Strings schneller verarbeiten
Prüfe ich nur wenn es um sehr große Datenmengen geht ...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive