Strings schneller verarbeiten

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
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

Beitrag 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
Benutzeravatar
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

Beitrag 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
Benutzeravatar
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

Beitrag 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.
Benutzeravatar
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

Beitrag von NicTheQuick »

Bei Listen bleibt die Reihenfolge immer erhalten. Bei Maps nicht, weil die intern anders funktionieren.
Benutzeravatar
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

Beitrag 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!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Strings schneller verarbeiten

Beitrag 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
a²+b²=mc²
Benutzeravatar
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

Beitrag von Jac de Lad »

Danke Peter, so habe ich es auch schon gelöst. Vorher 520 Sekunden, jetzt <2, LOL, dämliche Strings. :lol:
Benutzeravatar
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

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Strings schneller verarbeiten

Beitrag 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?
a²+b²=mc²
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Strings schneller verarbeiten

Beitrag von mk-soft »

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
Antworten