Autor Beitrag
freetrader
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 12.08.04 18:41 
Hallo Leute,
ich bastele gerade an einer Anwendung in D6, die sehr umfangreiche mathematische Analysen (Markov-Ketten) rechnet. Dabei kriege ich bei sehr großen Datensätzen immer wieder das Problem, dass nicht genug Speicher für die verwendeten dynamischen Arrays allokiert werden kann. Der Fehler ist "EOutofmemory". Bei kleineren Datensätzen tritt kein Problem auf. Kann man das irgendwo einstellen, dass von vornherein mehr Speicher für die Arrrays reserviert wird? Oder würde sich ein Upgrade auf D7 lohnen?
Danke!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 12.08.04 18:44 
Hallo und :welcome: im Delphi-Forum!
Ich empfehle die Verwendung einer TList, obwohl ich zu bezweifeln wage, ob das den Fehler unterdrückt. Um wieviel MBs handelt es sich denn schätzungsweise?

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
freetrader Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 12.08.04 18:49 
hm, das ist schwer genau festzustellen. Es sind insgesamt 4 Arrays mit jeweils ca. 50.000 Positionen. An jeder Arrayposition hängt der folgende Record:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type

  TWort = record
    MinimaleWortLaenge: integer;
    MaximaleWortLaenge: integer;
    AnzahlWorte: integer;
    DurchschnittlicheWortLaenge: real;
    StandardabweichungWortLaenge: real;
    MittlereAnzahlWorte: real;
    StandardabweichungAnzahlWorte: real;
    WortLaenge: integer;
    nWorte: array of integer; {Länge dieses Arrays ca. zwischen 1 und 50}
    Wortlaengen: array of integer; {Länge dieses Arrays ca. zwischen 1 und 50}
  end;


Dazu kommen noch ein paar kleinere Arrays, die aber nicht so viel Speicher fressen.
Danke für die Hilfe!
freetrader


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 12.08.04 18:56 
Debugge dein Programm mal mit einem Speichertool wie MemProof. Ich habe die Vermutung, dass du irgendwie eine runde Größe überschreitest.

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
freetrader Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 12.08.04 19:05 
Danke für den Tip, lade mir das Tool grade mal runter.

Grundsätzlich bringt es wohl nichts, auf D7 zu wechseln, oder? Ich verstehe einfach nicht, warum Delphi nicht auf den virtuellen Speicher von Windows zurückgreift. 20 gig freier Platz auf der Platte müsste doch eigentlich reichen ...
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Do 12.08.04 19:24 
Hallo freetrader!

freetrader hat folgendes geschrieben:
Ich verstehe einfach nicht, warum Delphi nicht auf den virtuellen Speicher von Windows zurückgreift.


Delphi greift natürlich (wie jedes unter Windows laufende Programm) auf den virtuellen Speicher zurück - daran liegt es also nicht. Die Grenze für den verwendbaren Speicher liegt übrigens bei 2GB!

Wenn ich "dynamische Arrays" lese, sehe ich schon ein Problem: ein ständiges Vergrößern des Arrays um 1 bewirkt, daß alles an eine neue Adresse umkopiert wird - der alte Bereich ist dann in der Regel nicht mehr nutzbar. So kann man sich schnell den Speicher vollmüllen.

Dynamische Arrays sollten in der zu erwartenden Größe angelegt und ggf. um einen angepaßten Wert vergrößert werden. Das spart die Speichervermüllung, erfordert allerdings entspechende Hilfsvariablen zur Verwaltung des letzten belegten Array-Elements.

Bei Stringlisten z.B. geht Delphi so vor.

Fazit: Du hast vermutlich ein Design-Problem.

Gruß

Dietmar Brüggendiek
freetrader Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 12.08.04 21:10 
danke für den Tipp. Ich probier mal aus, ob das Problem dadurch gelöst wird, wenn ich die Arrays erst mal in entsprechender Größe anlege.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 12.08.04 21:21 
Gibt's eigentlich ne Möglichkeit Delphi mitzuteilen, dass es den Speicher entmüllen soll? Hab zwar mal in der System.pas den Source für den VMM von Delphi gefunden (ganz nette verkettete Listen), aber nix, womit man den aufräumen kann.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.