Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zwei Dictionaries vergleichen (https://www.delphipraxis.net/207698-zwei-dictionaries-vergleichen.html)

DieDolly 23. Apr 2021 14:51

Zwei Dictionaries vergleichen
 
Dictionaries sind mir recht neu irgendwo. Wie kann man zwei davon schnellstmöglich vergleichen?
Der Key ist ein string, Value ist ein Record-Typ.

Ich möchte die beiden vergleichen, damoit im zweiten Dictionary nur noch die Unterschiede drin sind.
Hat DictionaryA also 1 2 und 3, und DictionaryB 1 2 3 4 und 5, dann soll B am Ende nur noch 4 und 5 enthalten.

Das geht sicher über eine Schleife. Aber wie geht das performant?

Uwe Raabe 23. Apr 2021 14:57

AW: Zwei Dictionaries vergleichen
 
Was ist an der Schleife denn nicht performant und wie sieht die bei dir überhaupt aus? Wie misst du, ob etwas performant ist oder nicht?

Rollo62 23. Apr 2021 15:04

AW: Zwei Dictionaries vergleichen
 
Willst Du nur die Keys vergleichen, oder Key+Value ?

Im 2. Fall könntest Du sogar ein MultiMap brauchen.
Ich würde mal bei Spring4D Container reinschauen, da gibt es eigentlich etwas Performantes für jeden Fall.

DieDolly 23. Apr 2021 16:57

AW: Zwei Dictionaries vergleichen
 
Mein Problem, was eigentlich ein anderes ist wie ich herausgefunden habe, könnte vermutlich durch OmniThreadLibrary gelöst werden. Aber ForEach wie auch TParallel.For akzeptieren leider keinen String
Delphi-Quellcode:
Parallel.ForEach(0, List.Count - 1).NoWait.PreserveOrder.Execute(
 procedure(const Key: string; var Result: TOmniValue)
List ist mein TDictionary<string, record-typ>. Gibt es da einen Trick?

Stevie 24. Apr 2021 13:35

AW: Zwei Dictionaries vergleichen
 
Ein TDictionary ist nicht thread-safe, also wird dir da nen parallel for nicht viel bringen.
Die Operation, die im ersten Post gefragt war, ist O(n) wobei n die Anzahl der Elemente in A ist, also nix wildes, wo man sich Sorgen machen müsste.

Delphi-Quellcode:
for var key in a.Keys do
  b.Remove(key);

himitsu 24. Apr 2021 14:48

AW: Zwei Dictionaries vergleichen
 
TThreadList ist thread-save, drum heißt die auch so. :zwinker:

alles Andere musst immer DU absichern.
CriticalSection, System.TMonitor oder sonstwie

DieDolly 24. Apr 2021 15:45

AW: Zwei Dictionaries vergleichen
 
Ich habe jetzt herausgefunden, dass das Grundproblem ein anderes ist und nicht die Liste ansich. Dafür werde ich denächst ein neues Thema öffnen. Danke bis hierhin für alle Antworten. TThreadList werde ich bestimmt trotzdem in Zukunft benötigen. Und die Sache mit b.Remove(key) auch.

TurboMagic 24. Apr 2021 16:22

AW: Zwei Dictionaries vergleichen
 
Ich glaube auch, dass du mittels for in durch ein Dictionary iterieren können solltest...

Stevie 25. Apr 2021 15:47

AW: Zwei Dictionaries vergleichen
 
Zitat:

Zitat von himitsu (Beitrag 1487750)
TThreadList ist thread-save, drum heißt die auch so. :zwinker:

alles Andere musst immer DU absichern.
CriticalSection, System.TMonitor oder sonstwie

Auch eine TThreadList musst du explizit absichern, nämlich mit LockList, welche intern ein TMonitor.Enter ausführt, und sie wieder unlocken mit UnlockList.
Das sollte bei der Veränderung in einer parallel for eine ziemlich bescheidene Performance bewirken.

Zitat:

Zitat von TurboMagic (Beitrag 1487759)
Ich glaube auch, dass du mittels for in durch ein Dictionary iterieren können solltest...

Ist unnötig für den geforderten Usecase - ein Iterator für ein Dictionary gibt die Key/Value Pairs, hier sind aber nur die Keys vonnöten - daher .Keys iterieren, wie ich oben schrieb.

himitsu 26. Apr 2021 08:29

AW: Zwei Dictionaries vergleichen
 
vieles sichert die Threadlist selbst ab. (add, exists und remove) .... paar atomare Funktionen von TStack und TQueue und Co wären noch toll, wie z.B. Push und Pop, bzw. TryPop. oder die Threadlist mit mehr generics ohne casts.
und an die unsicheren Sachen kommt man so nicht "ausversehn" ran, sondern muß eben erst sowas wie LockList nutzen.
dass man beim iteriiren die Liste explizit sperren muß, sollte ja klar sein.

also per-se erstmal alles relativ sicher und der Rest muß eben erst freigeschaltet und aufgepasst werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz