Seite 4 von 9

Re: FindMapElement

Verfasst: 22.06.2014 20:45
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.

Re: FindMapElement

Verfasst: 22.06.2014 21:02
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 

Re: FindMapElement

Verfasst: 22.06.2014 21:18
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.

Re: FindMapElement

Verfasst: 22.06.2014 22:46
von Martin66119
Ja, da hast du recht Stargate.

Re: FindMapElement

Verfasst: 23.06.2014 06:58
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.

Re: FindMapElement

Verfasst: 23.06.2014 09:07
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.

Re: FindMapElement

Verfasst: 23.06.2014 10:26
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.

Re: FindMapElement

Verfasst: 23.06.2014 11:13
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.

Re: FindMapElement

Verfasst: 23.06.2014 11:39
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.

Re: FindMapElement

Verfasst: 23.06.2014 19:18
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.