![]() |
su. nach speichersparender Array-Variante
Hallo,
Bin bei meiner Programmierung auf der Suche nach einer speicherplatzsparenden Array-Variante. Mein Array im untenstehendes Code führt bei einer Arraydimension [1..512, 1..512, 1..100] zumZulaufen desd Arbeitsspeichers. Error:= 'zu wenig Arbeitsspeicher'; Codebeispiel:
Delphi-Quellcode:
Hat nicht jemand eine Idee ?!TEB_Pix = class(TObject) private FPix: integer; procedure SetPix(const Value: integer); function getPix: integer; protected public published property Pix: integer read getPix write SetPix; end; TEB_Grauwert = class(TObject) private FGrauwert: word; procedure SetGrauwert(const Value: word); function GetGrauwert: word; protected public published property Grauwert: word read GetGrauwert write SetGrauwert; end; TEB_PixMatrix = array of array of TEB_Pix; // 512 x 512 TEB_GrauMatrix = array of array of array of TEB_Grauwert; // 512 x 512 x 100 TEB_Buffer = array of Byte; { TEB_Bild } TEB_Bild = class(TObject) private ... FPixMatrix: TEB_PixMatrix; FGrauMatrix: TEB_GrauMatrix; ... ... function GetGrauMatrix(Xind, Yind, Zind: integer): TEB_Grauwert; function GetPixMatrix(Xind, Yind: integer): TEB_Pix; procedure SetGrauMatrix(Xind, Yind, Zind: integer; const Value: TEB_Grauwert); procedure SetPixMatrix(Xind, Yind: integer; const Value: TEB_Pix); protected public property PixMatrix[Xind, Yind: integer]: TEB_Pix read GetPixMatrix write SetPixMatrix; property GrauMatrix[Xind, Yind, Zind: integer]: TEB_Grauwert read GetGrauMatrix write SetGrauMatrix; ... published ... end; var Bild: TEB_Bild; Danke im Voraus EB PS: WinXP prof 2GB RAM 2GB Page |
Re: su. nach speichersparender Array-Variante
Hast du mal berechnet, wie viel Speicher belegt werden würde
512 * 512 * 100 * 2 Byte = 52428800 KByte = 50 GB |
Re: su. nach speichersparender Array-Variante
Hallo mkinzer,
danke, aber ich glaube hier an einenRechenfehler. 1 Word = 2Byte und somit wären es 50 MB Liege ich hier falsch ?? EB |
Re: su. nach speichersparender Array-Variante
Also ich komme auf 512 * 512 * 100 * 4 (eine Objektreferenz ist doch 4 Byte groß, oder?) = 104.857.600 Byte zzgl. Speicherbedarf für die Objekte selbst.
|
Re: su. nach speichersparender Array-Variante
Stimmt, habe übersehen, dass es eine Klasse ist (bin von einem Record ausgegangen). Die 2 bezogen sich auf FGrauWert (Word). Da es Klssen sind, kommt diese noch dazu; dann wären es schon 150GB Platzbedarf
|
Re: su. nach speichersparender Array-Variante
hallo mKinzer,
verstehe ich leider nicht record -- Klassen ? 150 GB ? Danke EB |
Re: su. nach speichersparender Array-Variante
GB? Eher MB ;)
|
Re: su. nach speichersparender Array-Variante
Zitat:
Grüße Klaus |
Re: su. nach speichersparender Array-Variante
Haste recht: sind ja Bytes
512 * 512 * 100 * (4 + 2) = 157.286.400 Bytes /1024 = 153.600 KByte / 1024 = 150 MBytes |
Re: su. nach speichersparender Array-Variante
mKinzer,
nun ist leider die Diskussion entgleist. mKinzer, ich wollte Dich nicht blamieren, will einfach nur mein Programm zum laufen bringen. Gruß EB |
Re: su. nach speichersparender Array-Variante
Die Frage ist wieso du bei Nutzung von 150MB für ein Objekt "Out of Memory" gehst.
Wieviele solcher Objekte werden erzeugt? Die Nutzung von Records würde schon mal die Speichernutzung um den Faktor 3 vermindern. |
Re: su. nach speichersparender Array-Variante
Nicht du hast mich blamiert, sondern ich selber :wall:
|
Re: su. nach speichersparender Array-Variante
.. wäre es nicht sinnvoller einer Methode getGrauwert oder setGrauwert
die Koodinaten im Array zu übergeben und den Grauwert zu ermitteln als ein Array mit den ObjectInstanzen zu erstellen. Grüße Klaus |
Re: su. nach speichersparender Array-Variante
Hallo, Du hast recht, Tyreal.
Ich habe mich in der Benutzung des Objektes verheddert, also unbeabsichtigt 100mal erzeugt. Das erklärt dann auch alles. Dank und Grüße EB |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 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