VB: Out of memory by ReDim

flowpow

Grünschnabel
Hallo,

ich habe unter XP Probleme mit ReDim mehr als 800 MB zu reservieren, obwohl laut Taskmanager über 2 GB verfügbar sind. Der RAM beträgt 3 GB und die Gesamtkapazität mit Auslagerungsdatei ca 5 GB. Bei ca 750 MB funktioniert dies.

Der Quelltext sieht etwa so aus:

Dim x() as single

Redim x(225000000) 'entspricht 858,3 MB bei Single=4Byte

Woran kann es liegen?

Gruß
flowpow
 
Hi

ein Array wird immer so angelegt,
dass alle Elemente ohne Unterbrechung hintereinander kommen.

Wenn zB. 2GB insgesamt frei sind, kanns ja so sein:
100MB frei, 20MB besetzt, 400MB frei, 120MB besetzt usw...
Der freie Speicher bezieht sich auf die Summe aller freien Teile.
Um alles mit einem Array füllen zu können,
müsste es aber ein großer zusammenhängender Freibereich sein.

Bis zu einem gewissen Grad kann das bei Bedarf vom Betriebssystem umgeschichtet werden,
aber auch nicht unbegrenzt.

Wenn du alles ausnutzen willst, mach mehrere kleine Arrays und teil die Elemente auf.

Gruß
 
Hallo sheel,

nach einem Neustart dürfte der Hauptspeicher eigentlich nicht fragmentiert sein, trotzdem bekomme ich nicht genügend Speicher reserviert. Wenn ich den Speicherbedarf aufteile, z.B. 3 x 300 MB, so wird mir dieser auch zugeteilt, bei 4 x 300 MB funktioniert dies schon nicht mehr, obwohl über 2 GB physikalischer Speicher zur Verfügung steht. Leider benötige ich den Speicher en bloc, sodass ich im Moment nur meine zu verarbeitenden Datenmengen reduzieren muss.

Ich habe mir mal eine Beschreibung zur C-Funktion VirtualAlloc angeschaut. Beim ersten Aufruf dieser Funktion wird zunächst ein Speicherblock reserviert und mit weiteren Aufrufen für Teile (Speicherseite) dieses Blockes auch physikalischer Speicher zugewiesen. Dies kann zum Beispiel für die 3. und 5. Speicherseite erfolgen, bevor dort Daten abgelegt werden. Wenn ein Speicherblock aber nicht fragmentiert sein darf, würde diese Möglichkeit der Zuweisung doch keinen Sinn machen, oder? Da die Funktion ja nicht wissen kann, ob ich jetzt die Speicherseiten 3 bis 5 en bloc brauche oder die Speicherseiten 4 bis 7, dürfte die Zuweisung von physikalischen Speicher nur für den ganzen reservierten Speicherblock möglich sein.

Viele Grüße
flowpow
 
Zurück