Autor Beitrag
thomasoop
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29


D5 + D6 Enterprise
BeitragVerfasst: Mo 11.04.05 14:53 
Hallo Delphi Freunde
Ich habe ein dynamisches Array das zur Laufzeit vergrössert und gefüllt wird.
ausblenden Delphi-Quelltext
1:
aloText : Array of String;					

Nach ca 52000 Elementen bricht das Programm aber mit der Fehlermeldung "Zu wenig Arbeitsspeicher" ab.
Der Taskmanager sagt mir das zu der Zeit ca 720 von 1024 MB voll sind. Sollte also noch genug Platz sein.
Benutze Delphi 5 Enterprise.
Muss ich irgendwo noch etwas höher setzen(ich vermute ich habe da irgendeine Grenze erreicht)?

Gruss
Thomas(OOP)

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
cartridge
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 209

Win XP
D4 Prof,D6 Prof
BeitragVerfasst: Mo 11.04.05 15:13 
Hi!

Also bei 65535 ist sowieso Schluss. Vielleicht bist Du ja da schon.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 11.04.05 15:23 
@cartridge: Wie kommst du denn da drauf? Wenn du ein statisches Array als lokale Variable hast, dann bist du vielleicht schnell mal an der Grenze, bei dynamischen Arrays gibt's aber keine solchen Grenzen!

@thomasoop: Vergrösserst du das Array immer um 1 Element? Bei einem Array sind die Daten immer am Stück. Wenn du jetzt das Array immer um 1 Element vergrösserst, kann das Probleme geben (wenn kein Virtual Memory Block mehr existiert, wo das ganze reinpasst). Das ganze ist auch ziemlich ineffizient, da beim Vergrössern des Arrays evtl. die ganzen Daten im Memory umgeschaufelt werden müssen. Im Normalfall reserviert man nie zusammenhängende Memoryblöcke, die fast 1GB gross werden. Du solltest das ganze vielleicht ein wenig umprogrammieren (ohne dynamischen Arrays).

PS: Ich sehe, es ist ein array of strings. Es wird also kein Memoryblock alloziert, welcher mehrere hundert MB gross sind ;) Vielleicht probierst du mal die TStringList aus, obwohl das Problem wahrscheinlich damit nicht gelöst ist.
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Di 12.04.05 00:11 
user profile iconthomasoop hat folgendes geschrieben:
Nach ca 52000 Elementen bricht das Programm aber mit der Fehlermeldung "Zu wenig Arbeitsspeicher" ab.
Der Taskmanager sagt mir das zu der Zeit ca 720 von 1024 MB voll sind. Sollte also noch genug Platz sein.

Speicher deine dynamische String-Liste in einer Datei. Das kannst du mit Hilfe einer eigenen Klasse und mit den Klassen THandleStream, TWriter und TReader sehr schnell realisieren. So wird dein Arbeitsspeicher nicht belastet und der Zugriff sollte bei heutigen Festplatten auch sehr schnell sein.

_________________
Ciao, Sprint.
thomasoop Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29


D5 + D6 Enterprise
BeitragVerfasst: Di 12.04.05 07:31 
intressant ist das es überhaupt eine grenze gibt und das diese bei ~52000 liegt
würde mich schon intressieren warum das so ist

notfalls könnte man eine verkettete liste benutzen

ich habe es aber jetzt so gemacht das ich meine daten in 2 stücken einlesen
das löst erstmal das problem
eingehender damit beschäftigen muss ich mich zu einen späteren zeitpunkt (deadline*hust*) :)

danke für eure Hilfe/Tips