Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicherstruktur - Bräucht ein paar Vorschläge (https://www.delphipraxis.net/29765-speicherstruktur-braeucht-ein-paar-vorschlaege.html)

Jelly 14. Sep 2004 14:36


Speicherstruktur - Bräucht ein paar Vorschläge
 
Hallo,

ich muss in einem Projekt Daten speichern, und zwar jede Menge und sehr schnell. Im Prinzip handelt es sich um ein dreidimensionales Gitternetz, wo ich in jedem Gitterpunkt mindestens einen, später sogar 2 Double-Werte speichern muss. Das Gitter hat mindestens eine Dimension 150x150x150 Punkte... Wer jetzt bischen rechnen kann, kommt somit schnell auf einen Speicherbedarf von:
150x150x150x2x8 = 54 MB, und das ist zuviel... Es ist aber auch Tatsache, daß nicht alle 150x150x150 Gitterpunkte benötigt werden, sondern je nach Berechnung fallen da sicherlich gut 90% weg. Ich weiss aber nicht im voraus, welche Punkte das sind, da es sich um eine Monte Carlo Simulation handelt...

Jetzt ist meine Frage, wie würdet ihr solche Datenmengen gescheit irgendwie speichern. Ich denk mal, ein 3-dimensionales Array fällt da raus, aber wie sonst... Nochmals betont, das Speichern muss schnell gehen. Von daher fällt eine Datenbank sowieso schon mal weg. Aber irgendwelche komplizierten Algorythmen, wie ich jetzt mein Gitterpunkt einer Speichereinheit zuordne, in dem Sinne auch... Ich wollt deshalb hier mal fragen, bevor ich da irgendwie selbst rumprobiere, und dabei aber nichts Gescheites bei rausbekomme.

Danke schon mal,

Dax 14. Sep 2004 14:38

Re: Speicherstruktur - Bräucht ein paar Vorschläge
 
Delphi-Quellcode:
T3DArray = array of record
  X, Y, Z: Double;
end;

Jelly 14. Sep 2004 14:55

Re: Speicherstruktur - Bräucht ein paar Vorschläge
 
Und das Array kriegt dann wieder die Größe 150x150x150, oder? Doch genau das will ich ja vermeiden.

scp 14. Sep 2004 14:58

Re: Speicherstruktur - Bräucht ein paar Vorschläge
 
Nein, mach es am besten wie die 3D-Programme es machen: Speichere nur die Koordinaten X, Y und Z, an denen ein Gitterpunkt existiert. Die Verbindung der einzelnen Punkte (falls nötig) ergibt sich aus der Reihenfolge der Speicherung.

glkgereon 14. Sep 2004 15:01

Re: Speicherstruktur - Bräucht ein paar Vorschläge
 
was heisst denn das 90% der punkte nicht benötigt werden?
kann man das prüfen?

dann könnte man sagen

Delphi-Quellcode:
for x:=1 to 150 do
  for y:=1 to 150 do
    for z:=1 to 150 do
      if benoetigt(x,y,z)
      then begin
           if leer<>0
           then begin
                SaveFile.Add('#'+inttostr(leer));
                leer:=0;
                end;
           SaveFile.Add(floattostring(werte[x,y,z]));
           end;
      else leer:=leer+1;
es werden also die werte, und die leeren punkte dazwischen gespeichert...
du musst dann beim auslesen so in etwa sagen, wenn am anfang ein # dann um soundsoviele punkte weiter, isn bisserl knobelei....

Jelly 14. Sep 2004 16:49

Re: Speicherstruktur - Bräucht ein paar Vorschläge
 
Das mit den 90% kann man so natürlich pauschal nicht sagen. Es handelt sich um eine Monte Carlo Simulation, wo 100.000.000 Vorgänge simuliert werden, und in jedem Vorgang können jeweils lokal an einem Gitterpunkt Werte (in meinem Fall Enregien) gespeichert werden... Das passiert aber selbst bei 100.000.000 Vorgängen nicht an jedem Punkt, an anderen Punkten vielleicht etliche Millionen Male. Diese Punkte, wo erst mal nix passiert, für die will ich vermeiden, daß ich im Vorfeld bereits Speicher reserviere... Das wäre aber bei einem 150x150x150 gleich für jeden Punkt der Fall.

Ich meine 50MB gehen ja noch zur Not. Mein Ziel ist es aber ein wesentlich feineres Gitter zu konzipieren (1000x1000x1000 z.B.)... Das sprengt aber dann selbst den Speicher bei 1 GB RAM.

glkgereon 14. Sep 2004 16:55

Re: Speicherstruktur - Bräucht ein paar Vorschläge
 
leider is mir "Monte-Carlo-Simulation" kein begriff

kannst du mit meinem vorscvhlag von oben was anfangen?

scp 14. Sep 2004 17:03

Re: Speicherstruktur - Bräucht ein paar Vorschläge
 
Delphi-Quellcode:
type
  T3DPoint = record
    X, Y, Z: Double;
    Value1, Value2 : Double;
  end;
  T3DArray = array of T3DPoint;

var
  3DArray : T3DArray;
Einen neuen Punkt mit Werten legst du dann so an:
Delphi-Quellcode:
begin
  SetLength(3DArray, length(3DArray)+1);
  with 3DArray[length(3DArray)-1] do
  begin
    X := 123.456;
    // usw.
  end;
end;
Problem ist dann nur, wenn der Wert eines in der Array vorhandenen Punktes geändert werden soll, musst du den Array von 0 bis length(3DArray)-1 durchsuchen, um ihn wiederzufinden.

Chewie 14. Sep 2004 17:55

Re: Speicherstruktur - Bräucht ein paar Vorschläge
 
Du könntest ein Gitter auch realisieren, indem du eine verkettete Struktur aufbaust. Dabei enthält jeder Gitterknoten Referenzen auf seine Nachbarn. So wie bei einer Liste, nur nicht eindimensional, sondern dreidimensional!
Ist nur ein Gedanke, hab sowas noch nie gemacht, aber ich denke, es wäre eine Überlegung wärt. Versuch dir vielleicht zunächst mal vorzustellen, wie sowas in 2D aussehen würde, und es dann auf eine 3dimensionale Darstellung zu übertragen. Es wäre eine recht speichersparende Organisation, da die Verteilung im Raum keine Rolle spielt.

Jelly 15. Sep 2004 16:28

Re: Speicherstruktur - Bräucht ein paar Vorschläge
 
Hallo,
ich denk die Sache mit array of TRecord kann ich nicht nutzen, da, wie schon geschrieben, ich dann eventuell das ganze Array durchlaufen muss, umd festzustellen ob es schon den Punkt gibt.

Monte Carlo Simulation ist ein Zufallsverfahren, um nicht berechenbare Phänomene wenigestens näherungsweise zu berechnen...

Ich habs im Moment so:
Delphi-Quellcode:
type
 TEnergie = record
   Absorb1, Absorb : double ;
 end ;

var
 Energie : array of array of array of TEnergie ;
Ein 3-dimensionales dynamisches Array. Aber das ist nicht das was ich brauche.
@glkbkk: dein Vorschlag kann eventuell ein Ansatz sein, da ich in der Tat zur Laufzeit meine Punkte nicht suchen muss. Somit kann ich bei jeder Speicherung angeben, um welchen Gitterpunkt es sich handelt. Aber irgendwie hab ich dann anschliessend wieder das Problem, diese Liste zu lesen, und um doppelte Einträge aufzufinden.

Verkettete Listen ist eventuell auch noch ein Gedanke wert...

Danke schon mal für die Vorschläge.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 Uhr.
Seite 1 von 2  1 2      

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