![]() |
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? |
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?
|
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. |
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:
List ist mein TDictionary<string, record-typ>. Gibt es da einen Trick?
Parallel.ForEach(0, List.Count - 1).NoWait.PreserveOrder.Execute(
procedure(const Key: string; var Result: TOmniValue) |
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); |
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 |
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.
|
AW: Zwei Dictionaries vergleichen
Ich glaube auch, dass du mittels for in durch ein Dictionary iterieren können solltest...
|
AW: Zwei Dictionaries vergleichen
Zitat:
Das sollte bei der Veränderung in einer parallel for eine ziemlich bescheidene Performance bewirken. Zitat:
|
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 06:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz