tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
866
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    flowpow flowpow ist offline Mitglied
    Registriert seit
    Nov 2008
    Beiträge
    14
    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
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    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ß
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    flowpow flowpow ist offline Mitglied
    Registriert seit
    Nov 2008
    Beiträge
    14
    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
     

  4. #4
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Zitat Zitat von flowpow Beitrag anzeigen
    Leider benötige ich den Speicher en bloc
    Warum? Vielleicht finden wir eine andere Lösung, wenn du uns dein Vorhaben genauer erklärst.
     
    hihi = -h²

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Kann es sein, dass du dein Programm im Debug Modus ausführst?

    Lass es mal ohne Debugging laufen. Siehe http://social.msdn.microsoft.com/For...-0befe95e915e/

    Max. Arraygröße auf meiner Maschine (XP 32bit, .NET 3.5):

    mit debugging: 760 MiB
    ohne: 1248 MiB

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    flowpow flowpow ist offline Mitglied
    Registriert seit
    Nov 2008
    Beiträge
    14
    Zitat Zitat von Shakie Beitrag anzeigen
    Warum? Vielleicht finden wir eine andere Lösung, wenn du uns dein Vorhaben genauer erklärst.
    Ich verwende eine Ausgleichungsfunktion (in fortran-dll), die nicht von mir ist und die ich nicht beeinflussen kann, ich stelle lediglich den Speicher bzw. eine Referenz auf diesen für die Funktion zur Verfügung
     

  7. #7
    flowpow flowpow ist offline Mitglied
    Registriert seit
    Nov 2008
    Beiträge
    14
    Zitat Zitat von deepthroat Beitrag anzeigen
    Hi.

    Kann es sein, dass du dein Programm im Debug Modus ausführst?
    Im Nachhinein kann ich nicht mehr sagen, wann ich mit und wann ohne Debugging gearbeitet habe. Das werde ich aber nach meinem Urlaub nochmal untersuchen.

    Gruß
    flowpow
     

Ähnliche Themen

  1. Redim ohne löschen der Werte
    Von fredlllll im Forum .NET Windows Forms
    Antworten: 3
    Letzter Beitrag: 06.04.10, 17:11
  2. Not enough Memory
    Von headghot im Forum Cinema 4D
    Antworten: 1
    Letzter Beitrag: 07.03.10, 14:47
  3. Redim
    Von eyyyyy im Forum Visual Basic 6.0
    Antworten: 5
    Letzter Beitrag: 02.07.08, 14:12
  4. Redim Preserve funktioniert nicht
    Von dignsag im Forum Visual Basic 6.0
    Antworten: 4
    Letzter Beitrag: 08.05.06, 17:06
  5. VB: ReDim Preserve arrey() will nicht so wie ich will
    Von mashine-obf im Forum .NET Windows Forms
    Antworten: 3
    Letzter Beitrag: 16.11.05, 10:02