AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Code Optimierung

Offene Frage von "Diamondback2007"
Ein Thema von Diamondback2007 · begonnen am 21. Jul 2008 · letzter Beitrag vom 22. Jul 2008
Antwort Antwort
Seite 3 von 3     123   
nahpets
(Gast)

n/a Beiträge
 
#21

Re: Code Optimierung

  Alt 22. Jul 2008, 10:40
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
  Mit Zitat antworten Zitat
Benutzerbild von Diamondback2007
Diamondback2007

Registriert seit: 2. Feb 2007
260 Beiträge
 
Delphi 2007 Professional
 
#22

Re: Code Optimierung

  Alt 22. Jul 2008, 11:09
Ä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
Fabian E.
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#23

Re: Code Optimierung

  Alt 22. Jul 2008, 11:17
--
Ansgar
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#24

Re: Code Optimierung

  Alt 22. Jul 2008, 11:30
Zitat von Diamondback2007:
So, ich hätte jetzt folgenden Code:
...
Sollte das so klappen?
Nein. Du willst die Adresse der lokalen Variablen speichernm aber tmpPZN wird jedesmal verändert. Entweder Du veränderst die Hashmap, sodaß sie bei einem gefundenen Schlüssel die Data-Information gleich überarbeitet, oder Du erzeugst jedesmal Dir dynamisch einen Integer:
Mach es so:
Delphi-Quellcode:
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;
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.
Delphi-Quellcode:
StringDic.First;
While StringDic.Next (sID, PInteger (Data)) Do
  Dispose (Data);
Große Arrays erzeugt man übrigens dynamisch.
Delphi-Quellcode:
Var
  BigArray : Array Of Integer;

Begin
  SetLength(BigArray, 10000000);
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Diamondback2007
Diamondback2007

Registriert seit: 2. Feb 2007
260 Beiträge
 
Delphi 2007 Professional
 
#25

Re: Code Optimierung

  Alt 22. Jul 2008, 11:59
Achs
Zitat von alzaimar:
Zitat von Diamondback2007:
So, ich hätte jetzt folgenden Code:
...
Sollte das so klappen?
Nein. Du willst die Adresse der lokalen Variablen speichernm aber tmpPZN wird jedesmal verändert. Entweder Du veränderst die Hashmap, sodaß sie bei einem gefundenen Schlüssel die Data-Information gleich überarbeitet, oder Du erzeugst jedesmal Dir dynamisch einen Integer:
Mach es so:
Delphi-Quellcode:
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;
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.
Delphi-Quellcode:
StringDic.First;
While StringDic.Next (sID, PInteger (Data)) Do
  Dispose (Data);
Große Arrays erzeugt man übrigens dynamisch.
Delphi-Quellcode:
Var
  BigArray : Array Of Integer;

Begin
  SetLength(BigArray, 10000000);

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?
Fabian E.
  Mit Zitat antworten Zitat
Benutzerbild von Diamondback2007
Diamondback2007

Registriert seit: 2. Feb 2007
260 Beiträge
 
Delphi 2007 Professional
 
#26

Re: Code Optimierung

  Alt 22. Jul 2008, 12:32
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 .
Er braucht jetzt für die 13 Millionen Einträge kürzer als vorher für 100.000 .
Also vielen Dank schonmal .
Das war ja eine super Hilfe
Fabian E.
  Mit Zitat antworten Zitat
Benutzerbild von Diamondback2007
Diamondback2007

Registriert seit: 2. Feb 2007
260 Beiträge
 
Delphi 2007 Professional
 
#27

Re: Code Optimierung

  Alt 22. Jul 2008, 12:52
Hmmm... Ich habe noch etwas Probleme, die Werte aus der Map auszulesen...
Hier mal mein Code:
Delphi-Quellcode:
  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;
So, an sich klappt das nur leider bekomme ich dann Integer Überläufe angezeigt, also halt negative Werte.
Nehme ich nun beim Casten Int64 anstatt Integer, so kommen vollkommen falsche Werte herraus.
Was kann man dagegen tun?
Fabian E.
  Mit Zitat antworten Zitat
Benutzerbild von Diamondback2007
Diamondback2007

Registriert seit: 2. Feb 2007
260 Beiträge
 
Delphi 2007 Professional
 
#28

Re: Code Optimierung

  Alt 22. Jul 2008, 13:11
Okay, Problem gelöst. Ich musste natürlich Data nicht als PInteger sondern als PInt64 deklarieren.
Hier der gesamte Code:

Delphi-Quellcode:
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;
Vielen Dank
Fabian E.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#29

Re: Code Optimierung

  Alt 22. Jul 2008, 13:14
Delphi-Quellcode:
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;
Bei mir funktioniert das tadellos auch mit PInteger. Hast Du Data etwa schon wieder per Dispose freigegeben?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Diamondback2007
Diamondback2007

Registriert seit: 2. Feb 2007
260 Beiträge
 
Delphi 2007 Professional
 
#30

Re: Code Optimierung

  Alt 22. Jul 2008, 13:21
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
Fabian E.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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