Programm stürzt beim Füllen von Vektoren mit vielen Werten ab

  • Themenstarter Themenstarter XELLEX
  • Beginndatum Beginndatum
X

XELLEX

Hallo Leute,
ich hab das Problem, dass mein Programm beim Schreiben von vielen Werten in die Vektoren abstürzt:

CODE:
A.push_back(a);
B.push_back(b);
C.push_back(c);
D.push_back(d);
E.push_back(e);
F.push_back(f);
G.push_back(g);
H.push_back(h);
I.push_back(i);
J.push_back(j);
K.push_back(k);
L.push_back(l);
M.push_back(m);
N.push_back(n);
O.push_back(o);
P.push_back(p);
p++;
if(p>9){p=0; o++;}
if(o>9){o=0; n++;}
if(n>9){n=0; m++;}
if(m>9){m=0; l++;}
if(l>9){l=0; k++;}
if(k>9){k=0; j++;}
if(j>9){j=0; i++;}
if(i>9){i=0; h++;}
if(h>9){h=0; g++;}
if(g>9){g=0; f++;}
if(f>9){f=0; e++;}
if(e>9){e=0; d++;}
if(d>9){d=0; c++;}
if(c>9){c=0; b++;}
if(b>9){b=0; a++;}

Dieser Code befindet sich in einer Schleife die je nach den Wünschen des Users >1.000.000.000 mal ausgeführt werden muss. Allerdings stürzt das Programm bei ca. 10.000.000 - 50.000.000 Wiederholungen ab.
Ich gehe davon aus, dass ich für die Vektoren genügend Arbeitsspeicher reservieren müsste, aber wie macht man das?
Kann es daran liegen oder bin ich da auf dem Holzweg...?

Gruß, XELLEX
 
Hi.

Wie ist der value_type der Vektoren?

Falls sizeof(value_type) == 1 ist, benötigst du aber immer noch mehr als 14 GiB Speicher für 1.000.000.000 Elemente.

Hast du ein 32 oder 64 bit OS?

Gruß
 
Ähm ... value_type ...?
Die Vektoren wurden so deklariert: vector<int> A...
Bis vor kurzem lief das Ganze auch noch nur jetzt macht es irgendwie Mucken, nachdem ich das Programm weitergeschrieben habe. Diese Änderungen/ Erweiterungen hängen aber vom Code in keiner Weise mit der Problemstelle zusammen...
Ich verwende Vista Ultimate x64 und zu dem mit den 14GB Arbeitsspeicher:
1. hab ich natürlich nicht - bei mir sind es 4 ;)
2. seit ihr euch da sicher, wenn man nur eine einzige Ziffer hinein schreibt? Bei meinen früheren Tests lief wie gesagt alles ohne Probleme bis zu einer Milliarde hoch und ballerte mir laut Taskmanager weder den Arbeitsspeicher noch die Auslagerungsdatei voll.
 
Und wie wir uns da sicher sind ;)

Folge doch einfach der Logik:
Ich nehme an, dass du als 32bit Image compiliert hast, also wäre sizeof(int) == 4 (bytes) ... bei 1 Milliarden durchgängen und 16 Vectoren, werden 1.000.000.000 * 4 * 16 = 64.000.000.000 Bytes Speicher benötigt ( oder jenen Wert durch 1024^3 teilen: 59.6 GigaByte), und die müssen ja irgendwo hin ;)

Dass vor deiner Codeänderung alles geklappt hat, lässt sich nur dadurch erklären, dass zu diesem Zeitpunkt die Vektoren durch irgendeinen Fehler in deinen Programmtext gar nicht gefüllt wurden.

Edit:

Wenn ich mal fragen darf, was bezweckst du überhaupt zu gestalten ? :P
 
Zuletzt bearbeitet:
Ähm ... value_type ...?
Die Vektoren wurden so deklariert: vector<int> A...
Also ist der value_type der Vektoren int.
Bis vor kurzem lief das Ganze auch noch nur jetzt macht es irgendwie Mucken, nachdem ich das Programm weitergeschrieben habe. Diese Änderungen/ Erweiterungen hängen aber vom Code in keiner Weise mit der Problemstelle zusammen...
Ich verwende Vista Ultimate x64
Gut, da kannst du zumindest genug Speicher adressieren. (wenn du ein 64bit Programm erstellst!)
und zu dem mit den 14GB Arbeitsspeicher:
1. hab ich natürlich nicht - bei mir sind es 4 ;)
2. seit ihr euch da sicher, wenn man nur eine einzige Ziffer hinein schreibt? Bei meinen früheren Tests lief wie gesagt alles ohne Probleme bis zu einer Milliarde hoch und ballerte mir laut Taskmanager weder den Arbeitsspeicher noch die Auslagerungsdatei voll.
Du hast 16 Vektoren des Datentyps int und du verwendest push_back() 1.000.000.000 mal in einer Schleife (laut deiner Aussage). D.h. jeder der 16 Vektoren besitzt eine Größe von 1.000.000.000.

Ein int belegt üblicherweise 4 Byte. D.h. 16 * 4 * 1.000.000.000 = 59.6 GiB.

Du kannst dir ja mal die max. Größe eines std::vector<int> ausgeben lassen:
C++:
cout << std::vector<int>().max_size() << endl;

Gruß
 
Vektoren haben die Eigenschaft, dass sie an einem Stück im Speicher liegen.
Das kann bei push_back() zum Problem werden.
Angenommen du hast zu Beginn reserve(1000000) gemacht.
Irgendwann wird push_back() zum 1000001. Mal aufgerufen. Dann fordert der Vektor erstmal ein neues Stück Speicher an (evtl. mit Größe 2000000).
Das heißt, während dieses Vorgangs hast du kurzzeitig 3 Mio Speicherplätze belegt.
Wenn das gelungen ist, wird der alte Vektor in den neuen kopiert und zum Schluss der alte gelöscht.

Deswegen folgende Tipps:
- Wenn du vorab feststellen kannst, wie groß der Vektor wird, dann mache das und setze zu Anfang reserve(n). Das verhindert das zeitaufwändige Umkopieren.
- setze deinen Code in eine try-catch-Anweisung. Die Vektorfunktionen stürzen nämlich nicht einfach ab, sondern geben ihren Geist über wohldefinierte exceptions auf.
C++:
try {
   // Operationen mit Vektor
  // ...
} catch (const std::exception& ex) {
  std::cout << "Fehler: " << ex.what() << std::endl;
}
kann z.B. die Meldung "Fehler: vector<T> too long!" auswerfen.
 
Zuletzt bearbeitet von einem Moderator:
Dickes Danke an Onkel Schuppig!
Jetzt wird mir statt eines Absturzes das ausgegeben: "Fehler: St9bad_alloc"
Was bedeutet das?
 
Zurück