Speicher-Reservierung in 64 bit Visual c++ Express-Edition-2010 auf w7-64bit Obergrenze von 2 GB



  • Wie kann man die Grenze bei der Speicherverwaltung des Arrays von 2 GB Überschreiten.
    Es sollte in ein Verschlüsselungsprogramm integriert werden.
    Diese läuft in WINAPI seit 2 Jahren zuverlässig.
    Bis jetzt werden auch sehr große Dateien damit bearbeitet, aber
    wegen der Speicherobergrenze nur abschnittsweise.
    Die größte Datei (eine truecrypt Container Datei) war über 900-GB groß.
    Als Beispiel für die Fragestellung habe ich ein Programm in der Konsole geschrieben.
    Hier werden Zufallszahlen nach der Zeit-Initiierung von 0-256 erzeugt und in ein Array ablegt.
    Aus diesem Grunde habe ich die Frage erst mal in die Konsolenabteilung gestellt.
    Im Beispiel sollten die Zufallszahlen nach Verteilung gezählt werden.
    Bei der Erhöhung der Arraygröße (int i) wird (ab 350 000 000 Int-Zahlen) die Obergrenze erreicht.
    Speicher und Leistung sind vorhanden (W7-64bit mit I7 und 8-GB-Ram).
    Auch für andere Methoden, z.B. statische Speicherreservierung oder notwendige Veränderungen in der Programierumgebung wäre ich sehr dankbar.
    Bis jetzt habe ich lange und oft in verschieden Suchmaschien nach eine Lösung gesucht.

    Kann mir da jemand ein paar Tips geben?
    Danke schon mal!

    // Arraygröße 
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <new>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout <<  "speicher wird reserviert ";
    	int i,n;
    	int zufall;
    
        time_t t;
    
        time(&t);
        srand((unsigned int)t);
    
    	int ergebnis[257];
    	int zwischen;
    
      int * p;
        i=7130449;
      //i=350000000;
      //i=350 000 000;
      p= new (nothrow) int[i];
    
      if (p == 0) cout << "Error: speicher allokation nicht möglich";
      else
    		  {
    			cout <<  "anfang, ";
    				  for (n=0; n<i; n++)
    							{
    							zufall=rand() % 256 + 1;
    							p[n]=zufall;	
    							}
    		  }
    				cout <<  "speicher beschrieben, ";
    
    	for (n=0; n<257; n=n+1){ergebnis[n]=0;};
    	for (n=0; n<i; n++)
    		{
    		zwischen=p[n];
    		//cout <<n<< "===" << zwischen;
    		//cout << "\n";
    		ergebnis[zwischen]=ergebnis[zwischen]+1;
    		}
    //for (n=0; n<i; n=n+1){
    //	cout << p[n] << ", ";}
    //   //delete[] p;
    // }
    	cout << i << ", ";
    			for (n=0; n<257; n=n+1)
    						{
    						cout <<n<< "-" << ergebnis[n];
    						cout << "\n";
    						}
    	return 0;
    }
    


  • 2 GB Grenze gibt's nur bei 32 Bit Programmen, unter 64 Bit hast du mehr als genug Platz (du erstellst doch ein 64-Bit-Programm, oder?). Dein Problem dürfte eher sein, dass du so viel Speicher am Stück reservieren willst. Teile deine Daten auf.



  • _matze schrieb:

    2 GB Grenze gibt's nur bei 32 Bit Programmen, unter 64 Bit hast du mehr als genug Platz (du erstellst doch ein 64-Bit-Programm, oder?). Dein Problem dürfte eher sein, dass du so viel Speicher am Stück reservieren willst. Teile deine Daten auf.

    Ich habe es auch mit Aufteilung der Daten probiert.
    Auch mit der statischen oder dynamischen Speicherreservierung kommt die Fehlermeldung: Gesamtgröße des Arrays darf 0x7fffffff Bytes nicht übersteigen
    Visual Express 2010 wurde unter W7 64 Bit installiert.
    Was muss man Unternehmen, um die Vorteile von 64 Bit zu genießen?
    Sicherlich ist es eine Voreinstellung des Kompilers oder der Programierumgebung zu ändern. Die Option "64Bit" erscheint nicht bei der Auswahl des Projektes. Alle Versuche, die im Netz zu finden waren, um die o.g. Einstellungen zu ändern, haben nicht gefruchtet. Laut MS-Beschreibung sollte die Adressierung bis 16TB möglich sein. Es erscheint so, als wurde die Programierungebung auf einen 64 Bit rechner im 32 Bit Modus laufen.

    auf der Seite:
    http://msdn.microsoft.com/de-de/library/9yb4317s(v=vs.80).aspx
    wird folgendes erwähnt:

    64-Bit-Tools sind in Visual C++ Express Edition standardmäßig nicht verfügbar. Um 64-Bit-Tools unter Visual C++ Express Edition zu aktivieren, installieren Sie das .NET Framework SDK zusätzlich zu Visual C++ Express Edition. Andernfalls tritt ein Fehler auf, wenn Sie versuchen, ein Projekt mit Visual C++ Express Edition für eine 64-Bit-Zielplattform zu konfigurieren.

    Diese Maßnahmen habe ich gemäß Beschreibung durchgeführt.

    Ich Programiere nur WINAPI und kein .Net.

    Auf der Seite:
    http://msdn.microsoft.com/de-de/library/ms241064.aspx

    Steht:
    Wenn Sie eine verwaltete 64-Bit-Anwendung auf einem 64-Bit-Windows-Betriebssystem ausführen, können Sie ein Objekt mit einer Größe von maximal 2 Gigabyte (GB) erstellen.

    Was muß man tun, um diese Hürden zu nehmen.
    Für jegliche Antwort wäre ich sehr dankbar.



  • Also bei mir läuft die VS2010EE für die x64 Plattform klaglos auch mit größeren Speicherblöcken wie

    char *x=malloc(5000000000);
    

    unter Win7/64 mit 6GB.
    Hast du deine Projekteigenschaften entsprechend angepasst?
    (Bei der nachträglichen SDK-Installation braucht man das ganze .net Geraffel nicht mitinstallieren)


Anmelden zum Antworten