FindMapElement

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FindMapElement

Beitrag von STARGÅTE »

Martin66119 hat geschrieben:Diesen könnte ich also verwenden, um meine Zeichenkette direkt in den Speicher zu schreiben.
Wozu? Strings selbst liegen auch "normal" im Speicher.
Martin66119 hat geschrieben:Wird der String im Memory mut Null abgeschlossen.
Ja wird er.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag von Martin66119 »

Warum wird dann bei DebugPeekS(*NewMemoryID) Hallo Welt Meisterschaft
ausgegeben. Un nicht Nur Hallo

Code: Alles auswählen

*MemoryID = AllocateMemory(1000) 
D.s = "Welt "
*Pointer = *MemoryID
CopyMemoryString("Hallo ", @*Pointer)
CopyMemoryString(D.s)
CopyMemoryString("Meisterschaft")

*NewMemoryID = ReAllocateMemory(*MemoryID, 2000) ; need more memory 
If *NewMemoryID 
  ; work with *NewMemoryID now with size 2000 
  ;
  Debug "The old content is still here:" 
  Debug PeekS(*NewMemoryID) 
  FreeMemory(*NewMemoryID) 
Else 
  ; resizing failed, keep working with *MemoryID (size 1000) 
  ; 
  FreeMemory(*MemoryID) 
EndIf 
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FindMapElement

Beitrag von STARGÅTE »

Weil du den String in diesem Beispiel nicht mit PokeS() schreibst (was du vorher gefragt hast), sondern mit CopyMemoryString(), was dafür gedacht ist, Strings direkt aneinander zu hängen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag von Martin66119 »

Ja, da hast du recht Stargate.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag von Martin66119 »

Guten Morgen.

Gestern Abend habe ich mal geschaut, wie lange das Sortieren der beiden Listen dauert und wie lange die eigentliche Suche.

SortList: Beide Listen 16ms
Auswertung: 6ms

Das Sortieren dauert also am längsten.
Wie kann ich denn bei einem DualCore das Sortieren aufteilen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: FindMapElement

Beitrag von NicTheQuick »

Das hab ich alles schon mal erklärt. Aber du gehst ja auf die wenigsten Dinge ein, die ich sage.
Du brauchst Threads. Aber ich habe keine Lust dir alles vorzuprogrammieren. Vor allem ist das alles andere als etwas für Anfänger. Ich glaube deine ganzen Terabytes an Daten hättest du mittlerweile schon längst durch gearbeitet.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag von Martin66119 »

Entschuldige bitte Nic wenn dich meine Fragen nerven. Wegen den Threads habe ich im Forum gesucht, doch leider nichts passendes gefunden. In der Hilfe steht auch nicht sehr viel drüber drin.

Was ich, so hoffe ich wenigstens, hinbekomme ist die beiden LinkList nach dem Sortieren in den Memory zu legen und dabei die StringLänge beim einlesen in FeldListe1() und FeldList2() zu schreiben. Das dauert ca. 2ms für die Berechnung der Längen. Da die ganze Auswertung mit deinem Code nur 6 ms dauert, bringt das wohl eher nichts.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: FindMapElement

Beitrag von NicTheQuick »

Martin66119 hat geschrieben:Was ich, so hoffe ich wenigstens, hinbekomme ist die beiden LinkList nach dem Sortieren in den Memory zu legen und dabei die StringLänge beim einlesen in FeldListe1() und FeldList2() zu schreiben. Das dauert ca. 2ms für die Berechnung der Längen. Da die ganze Auswertung mit deinem Code nur 6 ms dauert, bringt das wohl eher nichts.
Das Problem ist, dass ich wahrscheinlich mittlerweile schon so weit ins Detail gegangen bin, dass du verschiedene Aussagen miteinander vermischst. Es wird nichts bringen irgendwie nachträglich die Strings in einen gemeinsamen Speicherbereich zu schreiben, sondern das müsste man schon von Anfang an machen. Also die Datei als kompletten Block in den Speicher laden, statt Zeilentrennern Nullbytes rein schreiben und den Pointer auf den Anfang der Strings bzw. Zeilen in ein Array oder eine Liste schreiben. Dieses Array dann z.B. parallelisiert sortieren und dann vergleichen.

Leider habe ich gerade einen Bug gefunden, der das Sortieren von Pointer-Listen verhindert. Da muss man dann wohl seinen eigenen Quicksort basteln.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FindMapElement

Beitrag von STARGÅTE »

So wie ich das sehe, ist das mit SortStructuredList() nicht direkt ein bug, sondern einfach nur nicht implimentiert.

SortStructuredList() verlangt eine "echte" Struktur. Und kann nicht mit Pointer umgehen (in bezug auf die Verlinkung).
Das hat mich damals auch schon etwas genervt.
Ich hatte mir dann ein CustomSortList,CustomSortArray for own comparison procedures geschrieben.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: FindMapElement

Beitrag von Sicro »

Vielleicht reicht dir das ja auch schon:

Code: Alles auswählen

Structure CompareMapStruc
  ExistsInFile1.i
  ExistsInFile2.i
EndStructure

#Slots = 512 ; Dieser Wert erhöhen, um die Zugriffsgeschwindigkeit bei großen Datenmengen zu erhöhen (siehe PB-Hilfe)
NewMap Compare.CompareMapStruc(#Slots)

If ReadFile(0, "Datei_1")
  While Not Eof(0)
    Compare(ReadString(0))\ExistsInFile1 + 1
  Wend
  CloseFile(0)
EndIf

If ReadFile(0, "Datei_2")
  While Not Eof(0)
    Compare(ReadString(0))\ExistsInFile2 + 1
  Wend
  CloseFile(0)
EndIf

ForEach Compare()
  If Compare()\ExistsInFile1 And Not Compare()\ExistsInFile2
    Debug "Nur in Datei 1: " + MapKey(Compare())
    Debug "     Anzahl: " + Str(Compare()\ExistsInFile1)
    Debug "---------------------------------------------"
  ElseIf Compare()\ExistsInFile2 And Not Compare()\ExistsInFile1
    Debug "Nur in Datei 2: " + MapKey(Compare())
    Debug "     Anzahl: " + Str(Compare()\ExistsInFile2)
    Debug "---------------------------------------------"
  EndIf
Next
Der Nachteil bei diesem Code ist, dass er verschobene Zeilen nicht als Unterschied erkennt.
Datei 1 hat geschrieben:Hans
Peter
Thomas
Datei 2 hat geschrieben: Peter
Hans
Thomas
Die Beispieldateien oben wären also laut dem Code identisch, obwohl die ersten zwei Zeilen unterschiedlich sind.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten