ERLEDIGT
NEIN
NEIN
ANTWORTEN
9
9
ZUGRIFFE
434
434
EMPFEHLEN
-
18.06.10 16:06 #1XELLEX Tutorials.de Gastzugang
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
-
18.06.10 16:22 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
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ßIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
18.06.10 16:42 #3Mein System: Windows 7 64bit, Visual Studio 2010 C++, Ubuntu 10.04, Anjuta (Ich programmiere vorwiegend in Windows)
Programmiersprache: C
Wenn mein Beitrag geholfen oder sonst gut war, freue ich mich immer über eine Bewertung oder ein Danke!
Meine Homepage
-
18.06.10 16:48 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
18.06.10 18:17 #5XELLEX Tutorials.de Gastzugang
Ä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 ? :PGeändert von Anbrix (18.06.10 um 18:51 Uhr)
-
18.06.10 18:50 #7
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Also ist der value_type der Vektoren int.
Gut, da kannst du zumindest genug Speicher adressieren. (wenn du ein 64bit Programm erstellst!)
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:
Code cpp:1
cout << std::vector<int>().max_size() << endl;
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
18.06.10 21:35 #8
- Registriert seit
- Apr 2005
- Beiträge
- 191
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.
kann z.B. die Meldung "Fehler: vector<T> too long!" auswerfen.Code cpp:1 2 3 4 5 6
try { // Operationen mit Vektor // ... } catch (const std::exception& ex) { std::cout << "Fehler: " << ex.what() << std::endl; }
Grüße OS
-
19.06.10 11:52 #9XELLEX Tutorials.de Gastzugang
Dickes Danke an Onkel Schuppig!
Jetzt wird mir statt eines Absturzes das ausgegeben: "Fehler: St9bad_alloc"
Was bedeutet das?
-
Das bedeutet, dass er eben keinen Speicher allokieren konnte.
Gruß,
baddayGalaxy under Fire - 24/7 Online-Real-Time-Strategy-Game - servers are already running - Wir suchen einen Texturier für 3D-Modelle (bei Interesse einfach PM ;) )
Ähnliche Themen
-
Dropdownlist mit Werten füllen
Von xloouch im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 1Letzter Beitrag: 11.03.10, 12:55 -
Objekt-Array mit Werten füllen
Von Schlipfhunter im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 28.12.09, 11:08 -
Minimum von beliebig vielen double Werten
Von prinzschleifer im Forum JavaAntworten: 11Letzter Beitrag: 28.02.09, 13:19 -
Dropdown mit Werten füllen
Von dracom im Forum Javascript & AjaxAntworten: 1Letzter Beitrag: 06.04.05, 17:52 -
String Array nach Inititialisierung mit beliebig vielen Elementen füllen?
Von lukelukeluke im Forum JavaAntworten: 3Letzter Beitrag: 08.12.04, 17:35





Zitieren

Login






