![]() |
Re: Code Optimierung
Hallo,
wenn Du kein Array der passenden Größe machen kannst, dann mach doch 100. Eins für 0 bis 99999, eins für 100000 bis 199999 .... Per Case könntest Du dann nach iID-Bereich abfragen und entscheiden, in welches Array Du die Summe speichern muss. Naja, diese Lösung ist dann suboptimal und grenzt schon an Gefrickel, aber wenn's funktioniert... Wofür wird bitteschön der ganze Spaß gebraucht und wie ist mit der Verteilung der IDs zu rechnen? Gibt es da irgendwelche Bereiche von IDs, die überhaupt nur infrage kommen. Dann läßt sich das Array ja durch anpassen von min und max auf diesen Bereich einschränken ohne dass die übrige Logik davon betroffen wird. Zumindest von der Zeilenzahl der Liste, kann jede ID 1,3mal vorkommen. Die Hashmap muss dann auch entsprechend groß werden können. Stephan |
Re: Code Optimierung
Ähm naja das sind Daten aus dem medizinischen Bereich. Kann ich euch also nicht allzu viel zu sagen.
Es geht nur darum erst mal alle doppelten zu finden und zu addieren und danach alle IDs die die selbe Summe an PZNs haben zu einer Gruppe zusammenzufassen. Die Hashmap ist groß genug, die vergrößert sich von selber :) |
Re: Code Optimierung
--
|
Re: Code Optimierung
Zitat:
Mach es so:
Delphi-Quellcode:
Achtung! Hinterher aber die Data wieder mit Dispose freigeben! Dazu wanderst Du per 'First/Next durch die Hashmap und gibst einzeln die gelieferten Data wieder frei.
Type
PInteger = ^Integer; Var Data : PInteger; sID : String; for i := 0 to sl.Count - 1 do Begin tmpPZN := StrToInt32_JOH_IA32_7_a(ExtractPZN(sl.Strings[i])); sID := ExtractID(sl.Strings[i]); if not StringDic.Find(sID, Pointer (Data)) then begin New (Data); Data^ := tmpPZN; StringDic.Add(sID, Data); end else Inc(Data^, tmpPTN); end;
Delphi-Quellcode:
Große Arrays erzeugt man übrigens dynamisch.
StringDic.First;
While StringDic.Next (sID, PInteger (Data)) Do Dispose (Data);
Delphi-Quellcode:
Var
BigArray : Array Of Integer; Begin SetLength(BigArray, 10000000); |
Re: Code Optimierung
Achs
Zitat:
Okay vielen Dank erst einmal :) Dann werde ich mich mal damit beschäftigen ;) Wenn man das Array dynamisch erzeugt klappts dann auch größer oder was? :) |
Re: Code Optimierung
Also das mit dem Array scheint nicht zu funktionieren, dafür das mit der Hashmap aber umso besser :)
Also wenn die Daten die da jetzt rausgekommen sind wirklich stimmen, dann :shock: . Er braucht jetzt für die 13 Millionen Einträge kürzer als vorher für 100.000 :lol: . Also vielen Dank schonmal :) :) . Das war ja eine super Hilfe :dp: |
Re: Code Optimierung
Hmmm... Ich habe noch etwas Probleme, die Werte aus der Map auszulesen...
Hier mal mein Code:
Delphi-Quellcode:
So, an sich klappt das nur leider bekomme ich dann Integer Überläufe angezeigt, also halt negative Werte.
StringDic.First;
ListBox1.Items.BeginUpdate; for i := 0 to StringDic.TotalCount - 1 do begin StringDic.Next(sID, tmpData); ListBox1.Items.Add('ID: ' + sID + ' Summe: ' + IntToStr(Integer(tmpData^))); end; ListBox1.Items.EndUpdate; Nehme ich nun beim Casten Int64 anstatt Integer, so kommen vollkommen falsche Werte herraus. Was kann man dagegen tun? |
Re: Code Optimierung
Okay, Problem gelöst. Ich musste natürlich Data nicht als PInteger sondern als PInt64 deklarieren.
Hier der gesamte Code:
Delphi-Quellcode:
Vielen Dank :)
var
StringDic : TStringDictionary; tmpPZN : Integer; Data : PInt64; sl : TStringList; sID : string; [...] for i := 0 to sl.Count - 1 do begin tmpPZN := StrToInt32_JOH_IA32_7_a(ExtractPZN(sl.Strings[i])); sID := ExtractID(sl.Strings[i]); if not StringDic.Find(sID, Pointer(Data)) then begin New(Data); Data^ := tmpPZN; StringDic.Add(sID, Data); end else begin Inc(Data^, tmpPZN); end; end; |
Re: Code Optimierung
Delphi-Quellcode:
Bei mir funktioniert das tadellos auch mit PInteger. Hast Du Data etwa schon wieder per Dispose freigegeben?
Var
tmpData : PInteger; Begin StringDic.First; ListBox1.Items.BeginUpdate; while StringDic.Next(sID, tmpData) do ListBox1.Items.Add('ID: ' + sID + ' Summe: ' + IntToStr(tmpData^)); ListBox1.Items.EndUpdate; End; |
Re: Code Optimierung
Ich darf halt tmpData nicht als PInteger deklarieren... Dann gibt er mir den fehler dass die Parameter stimmen müssen. Ich brauche also einen untyped Pointer. Außerdem reicht Integer halt nicht aus von der Größe. Bei 13 Millionen Einträgen kommt da was zusammen ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 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 by Thomas Breitkreuz