tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
434
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    XELLEX 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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  3. #3
    Avatar von brunlorenz
    brunlorenz brunlorenz ist offline *C* & Windows-Freak
    Registriert seit
    May 2010
    Ort
    Zürich (Schweiz)
    Beiträge
    206
    Zitat Zitat von deepthroat Beitrag anzeigen
    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ß
    Das spielt eigentlich keine Rolle, da er sicher nicht 14 GB Speicher hat
     
    Mein 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

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von brunlorenz Beitrag anzeigen
    Das spielt eigentlich keine Rolle, da er sicher nicht 14 GB Speicher hat
    Das kommt drauf an wieviel virtuellen Speicher er hat. Der wird durch die Festplatte begrenzt und das ist ja wohl kein Problem, oder?

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

  5. #5
    XELLEX 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.
     

  6. #6
    Anbrix Anbrix ist offline Mitglied Silber
    Registriert seit
    Sep 2004
    Ort
    Duisburg
    Beiträge
    66
    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
    Geändert von Anbrix (18.06.10 um 18:51 Uhr)
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von XELLEX Beitrag anzeigen
    Ähm ... value_type ...?
    Die Vektoren wurden so deklariert: vector<int> A...
    Also ist der value_type der Vektoren int.
    Zitat Zitat von XELLEX Beitrag anzeigen
    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!)
    Zitat Zitat von XELLEX Beitrag anzeigen
    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:
    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.

  8. #8
    Onkel Schuppig Onkel Schuppig ist offline Mitglied Gold
    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.
    Code cpp:
    1
    2
    3
    4
    5
    6
    
    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.
     
    Grüße OS

  9. #9
    XELLEX Tutorials.de Gastzugang
    Dickes Danke an Onkel Schuppig!
    Jetzt wird mir statt eines Absturzes das ausgegeben: "Fehler: St9bad_alloc"
    Was bedeutet das?
     

  10. #10
    badday badday ist offline Mitglied Brokat
    Registriert seit
    Dec 2009
    Beiträge
    321
    Blog-Einträge
    1
    Das bedeutet, dass er eben keinen Speicher allokieren konnte.

    Gruß,

    badday
     
    Galaxy 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

  1. Dropdownlist mit Werten füllen
    Von xloouch im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 11.03.10, 12:55
  2. Objekt-Array mit Werten füllen
    Von Schlipfhunter im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 28.12.09, 11:08
  3. Minimum von beliebig vielen double Werten
    Von prinzschleifer im Forum Java
    Antworten: 11
    Letzter Beitrag: 28.02.09, 13:19
  4. Dropdown mit Werten füllen
    Von dracom im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 06.04.05, 17:52
  5. Antworten: 3
    Letzter Beitrag: 08.12.04, 17:35