STL-Vector, Fehler beim belegen von 2GB Arbeitsspeicher?
-
Hallo,
ich habe eine Matrix, die unter umständen recht groß wird (~2.5GB). Dummerweise bekomme ich schon beim belegen von 1.8GB (Rechner hat 2GB RAM) folgende Meldung:
"This application has requested the Runtime to terminate it in an unusual way."Folgendes Beispiel liefert den selben Fehler:
vector<vector<float > > testMatrix; testMatrix.resize(30000); for (int row=0; row < 30000; row++) { testMatrix[row].resize(25000); for (int col=0; col < 25000; col++) { // do something.. testMatrix[row][col] = 0; } cout << "Size in MB: " << row*25000*sizeof(float)/1024 << endl; } cout << " SUCCESSFULL " << endl;Woher kommt das Problem? ist das ein STL-Fehler? Lässt es sich umgehen?
-
Bei 2 GB stößt Du an die 32-Bit-Grenze. Wahrscheinlich wirst Du Probleme haben, mit einem 32-Bit-Programm überhaupt mehr als 2 GB zu adressieren. Bei solchen grössen solltest Du Dir Gedanken über ein 64-Bit-System machen.
Tommi
-
2 GB - 1,8 GB = 200 MB
Belegt dein OS nicht schon so knapp 200 MB? Außerdem, fang doch mal vernünftigerweise Exceptions ab, dann weiß du auch was schief gelaufen ist. Das die Leute das nicht lernen...

vector<vector<float > > testMatrix; testMatrix.resize(30000); for (int row=0; row < 30000; row++) { try { testMatrix[row].resize(25000); for (int col=0; col < 25000; col++) { // do something.. testMatrix[row][col] = 0; } cout << "Size in MB: " << row*25000*sizeof(float)/1024 << endl; } catch(const std::exception &ex) { std::err << ex.what() << std::endl; } } cout << " SUCCESSFULL " << endl;
-
Ich denke bei der Marge ist es nur natürlich dass das Programm baden geht. Die Berechnung wird man wohl aufteilen müssen.
a) braucht das Betriebssystem und andere Progs auch noch Speicher (200 MB halte ich für knapp)
b) bringt jeder vector<float> selbst noch etwas Overhead mitHm...
c) Sind für mich z.B. 30000 * 25000 * 4Bytes schon 2,8 GB

Und, ist nicht der virtuelle Adressraum bei 32-Bit und ohne PAE eh auf 2 GB begrenzt?
EDIT: Sooo viele (unbefriedigende) Antworten in sooo kurzer Zeit

-
danke für die Antworten!!
@Artchi: *an hirn schlag* stimmt! hatte ich ganz vergessen. Die Exception lautet erwartungsgemäß "bad allocation".
a) & b) der overhead scheint sehr gering zu sein, denn der Taskmanager zeigt 2.25GB und vor dem programmstart waren 450MB belegt.
c) richtig, 2.8 sollten eigentlich möglich sein.Das mit den 32-Bit hab ich mir auch schon überlegt... werd mich mal schlau machen ob da wirklich nicht mehr geht. Und was ist PAE?
-
PAE heisst Physical Adress Extension und ist eine (ziemlich teure
) Windows-Erweiterung die 48-Bit Adressraum (glaube ich) auf 32-Bit Windows ermöglicht.
-
Bei 2 GB stößt Du an die 32-Bit-Grenze.
Die 32-Bit-Grenze ist bei 4 GB. Die 2 GB-Grenze bei 32-Bit-Systemen wie z.B. Windows hat einen anderen Grund. S.u.
c) richtig, 2.8 sollten eigentlich möglich sein.
Aber nicht unter einem 32-bit Windows. Dort ist jeder Prozess auf maximal 2 GB beschränkt (die oberen 2 GB gehören dem BS, welches diese z.B. für Shared-DLLs usw. benutzt). Zumindest in der Default-Einstellung.