Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi su. nach speichersparender Array-Variante (https://www.delphipraxis.net/141744-su-nach-speichersparender-array-variante.html)

EccoBravo 15. Okt 2009 11:57


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:
 
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;
Hat nicht jemand eine Idee ?!


Danke im Voraus

EB

PS:
WinXP prof
2GB RAM
2GB Page

mkinzler 15. Okt 2009 12:07

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

EccoBravo 15. Okt 2009 12:10

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

DeddyH 15. Okt 2009 12:12

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.

mkinzler 15. Okt 2009 12:16

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

EccoBravo 15. Okt 2009 12:18

Re: su. nach speichersparender Array-Variante
 
hallo mKinzer,

verstehe ich leider nicht

record -- Klassen ?

150 GB ?

Danke EB

Tyrael Y. 15. Okt 2009 12:20

Re: su. nach speichersparender Array-Variante
 
GB? Eher MB ;)

Klaus01 15. Okt 2009 12:20

Re: su. nach speichersparender Array-Variante
 
Zitat:

Zitat von mkinzler
Hast du mal berechnet, wie viel Speicher belegt werden würde
512 * 512 * 100 * 2 Byte = 52428800 KByte = 50 GB

Kannst Du mir mal verraten wie Du da auf 50 GigaByte (50 * 10^9) kommst?

Grüße
Klaus

mkinzler 15. Okt 2009 12:23

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

EccoBravo 15. Okt 2009 12:24

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

Tyrael Y. 15. Okt 2009 12:27

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.

mkinzler 15. Okt 2009 12:29

Re: su. nach speichersparender Array-Variante
 
Nicht du hast mich blamiert, sondern ich selber :wall:

Klaus01 15. Okt 2009 12:34

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

EccoBravo 15. Okt 2009 13:00

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