Hat ein Vektor eine Maximalgröße?


  • Mod

    Ja, es gibt eine Maximalgröße. Diese hängt von dem System ab, auf dem das Programm ausgeführt wird. 500 MB ist ein typischer Wert für ein modernes System. Das aktuelle Maximum (es kann sich ändern) kann man mit vector::max_size() herausfinden.



  • also die Funktion max_size gibt bei mir 1073741823 zurück, allerdings kann ich damit nicht wirklich etwas anfangen. ist das in bytes?


  • Mod

    andi01 schrieb:

    also die Funktion max_size gibt bei mir 1073741823 zurück, allerdings kann ich damit nicht wirklich etwas anfangen. ist das in bytes?

    Das ist in Stück.



  • SeppJ schrieb:

    Ja, es gibt eine Maximalgröße. Diese hängt von dem System ab, auf dem das Programm ausgeführt wird. 500 MB ist ein typischer Wert für ein modernes System. Das aktuelle Maximum (es kann sich ändern) kann man mit vector::max_size() herausfinden.

    Ich edachte, moderne Systeme können 1.6G bis 1.8G und vector::max_size sei immer unsigned(-1)/sozeof(Ding).



  • SeppJ schrieb:

    Das ist in Stück.

    Äpfel? Byte? Ram-Riegel?
    http://www.cplusplus.com/reference/stl/vector/max_size/



  • achso^^

    Nexus schrieb:

    Es wird wohl Probleme geben, so grosse Speicherblöcke an einem Stück zu beschaffen. Vielleicht ist std::deque etwas für dich.

    habe mir währenddessen mal die dokumentation dazu durchgelesen; wenn ich das richtig verstanden habe ist der Unterschied zum Vektor also dass der Speicher für einen Vektor an einem Stück allokiert wird und der für deque muss nicht am stück sein.

    das heißt ich werde wohl deque verwenden müssen^^ das hat als maximale Speichergröße dann einfach den kompletten noch freien Hauptspeicher, oder?

    edit:

    volkard schrieb:

    Ich edachte, moderne Systeme können 1.6G bis 1.8G

    hm 1,8 GB würden mir ja reichen^^ aber woher kommt denn dann der fehler und wie behebe ich den?


  • Mod

    volkard schrieb:

    SeppJ schrieb:

    Ja, es gibt eine Maximalgröße. Diese hängt von dem System ab, auf dem das Programm ausgeführt wird. 500 MB ist ein typischer Wert für ein modernes System. Das aktuelle Maximum (es kann sich ändern) kann man mit vector::max_size() herausfinden.

    Ich edachte, moderne Systeme können 1.6G bis 1.8G und vector::max_size sei immer unsigned(-1)/sozeof(Ding).

    Ok, ein System von vor ein paar Jahren. Mit dem unsigned-1 hast du Recht (zumindest bei Datentypen der Größe 1), wie ich gerade festgestellt habe. Ich habe max_size() vorher noch nie praktisch benutzt. Ist ja völlig nutzlos so.

    edit: Und die eigentlich Frage: mehr als 1 GB Daten klingt erstmal verdächtig, das brauchen nur sehr wenige Anwendungen. Wozu braucht der Threadersteller sie? Vielleicht gibt es da ja was besseres.



  • also stimmt das mit den max. 1,6GB jetzt? denn dann müsste der fehler ja wo anders her kommen und ich habe keine ahnung wo ich suchen soll...

    debugging scheidet auch aus, in vollem tempo braucht das Programm schon 5 min bis zum crashpunkt, in einzelschritten würde das ewig dauern...



  • andi01 schrieb:

    also stimmt das mit den max. 1,6GB jetzt? denn dann müsste der fehler ja wo anders her kommen und ich habe keine ahnung wo ich suchen soll...

    Habe ich bereits erklärt. Wenn der Vektor vergrößert wird, wird temporär die Summe von alter und neuer Vektorgröße an Speicher gebraucht. Deswegen ist bei vector schon lange vorher Schluss.



  • ok, d.h. deque zu verwenden ist wohl die einzige Möglichkeit, oder?
    edit: denn das ganze zB in eine txt-datei auf die Festplatte auszulagern würde zu lange dauern, oder? allerdings wäre das so ziemlich die einzige Alternative...



  • andi01 schrieb:

    ok, d.h. deque zu verwenden ist wohl die einzige Möglichkeit, oder?

    Du kannst auch schon am Anfang (also wenn der vector noch (fast) leer ist) viel Speicher reservieren, dann kommst du weitaus näher an das Maximum.
    Damit bekomme ich immerhin einen vector mit 2.7 GB Kapazität, unter Windows wird es designbedingt etwas weniger sein.

    andi01 schrieb:

    denn das ganze zB in eine txt-datei auf die Festplatte auszulagern würde zu lange dauern, oder? allerdings wäre das so ziemlich die einzige Alternative...

    Kommt darauf an. Wenn du auf die Daten hauptsächlich sequentiell zugreifst, kann die Methode geeignet sein. Das ist auch sehr einfach mit memory mapped files zu realisieren.

    Edit: ach ja, vielleicht sollte man es noch erwähnen: bei einem 64 Bit-Programm hast du natürlich keine Limits mehr. Dafür läuft es dementsprechend nur auf 64 Bit-Betriebssystemen.

    Edit2: Mist verzapft.

    Edit3: doch keinen Mist verzapft 😡
    Rechnen will gelernt sein.



  • Du kannst auch schon am Anfang (also wenn der vector noch (fast) leer ist) viel Speicher reservieren

    das mache ich mit .resize(), oder? welchen wert muss ich dann bei resize angeben? einfach max_size()?

    dann kommst du weitaus näher an das Maximum.

    hm mein pc hat eh "nur" 2GB RAM, falls die überschritten werden, lagert er den Rest dann automatisch auf die Festplatte aus? man kann ja teile der festplatte als haupstspeicher freigeben...

    Kommt darauf an. Wenn du auf die Daten hauptsächlich sequentiell zugreifst, kann die Methode geeignet sein.

    naja also mein Vektor enthält eine Art Liste die ich mindestens einmal komplett durchgehen muss, die Performance ist da natürlich schon ziemlich wichtig^^
    mit den genauen Geschwindigkeitsunterschieden kenne ich mich allerdings nicht wirklich aus...

    Das ist auch sehr einfach mit memory mapped files zu realisieren.

    lol davon habe ich noch nix gehört xD
    ich hätte fstreams benutzt^^
    gibts da irgend eine gute doku oder ein gutes tutorial dazu?

    Edit: ach ja, vielleicht sollte man es noch erwähnen: bei einem 64 Bit-Programm hast du natürlich keine Limits mehr. Dafür läuft es dementsprechend nur auf 64 Bit-Betriebssystemen.

    leider scheidet diese option aus da ich ein 32bit-system habe^^ damit könnte ich die anwendung ja nie benutzen

    edit: außerdem wäre die methode mit den memory mapped files natürlich sehr gut weil ich damit fast unbegrenzt speicher zur Verfügung habe, naja nicht ganz unbegrenzt, aber auf jeden Fall genug 😃



  • andi01 schrieb:

    das mache ich mit .resize(), oder? welchen wert muss ich dann bei resize angeben? einfach max_size()?

    max_size() Elemente passen garantiert nicht in den Adreßraum. Eben so, dass es auf ~1.5 GB kommt. Du kannst ja ausprobieren, wie weit du kommst.
    Auch eher mit .reserve(), da .resize() die Elemente auch schon konstruiert, während .reserve() eben nur Speicher reserviert.

    andi01 schrieb:

    hm mein pc hat eh "nur" 2GB RAM, falls die überschritten werden, lagert er den Rest dann automatisch auf die Festplatte aus? man kann ja teile der festplatte als haupstspeicher freigeben...

    Ja. Aber mit 2 GB wird's nicht zum Swapping kommen, es sei denn, du hast noch viele andere Programme am Laufen.

    naja also mein Vektor enthält eine Art Liste die ich mindestens einmal komplett durchgehen muss, die Performance ist da natürlich schon ziemlich wichtig^^
    mit den genauen Geschwindigkeitsunterschieden kenne ich mich allerdings nicht wirklich aus...

    Das kommt dann allein auf die Schnelligkeit deiner Festplatte an. 20-100 MB/s sind realistisch zu erwartende Werte bei normalen Festplatten.

    lol davon habe ich noch nix gehört xD
    ich hätte fstreams benutzt^^
    gibts da irgend eine gute doku oder ein gutes tutorial dazu?

    Wird hier ausführlich erklärt (ich geh mal davon aus, du machst das unter Windows):
    http://msdn.microsoft.com/en-us/library/ms810613.aspx

    Prinzipiell ist es so, dass du eine Datei in deinen Adreßraum mappst, d.h. du kannst den Speicher benutzen, als hättest du ihn mit new angefordert, aber alle Änderungen werden auch in die Datei geschrieben. Über die ~1.5 GB kommst du damit trotzdem nicht, da das immer noch in deinen limitierten Adreßraum passen muss. Wenn du mehr brauchst, musst du tatsächlich selbst Hand mittels fstream & Co. anlegen.



  • (ich geh mal davon aus, du machst das unter Windows):

    ja, unter Win XP SP2 mit MS Visual Studio 2008 EE

    Wenn du mehr brauchst, musst du tatsächlich selbst Hand mittels fstream & Co. anlegen.

    naja noch weiß ich nicht wieviel ich genau brauche weil mein programm bei ca. 500MB crasht...

    naja ich werde mir das morgen mal genauer anschaun...



  • Schon mal überlegt, obs ne ganz andere Lösung gibt? Wofür brauchst du so nen Großen vector?



  • Athar schrieb:

    IIRC verdoppeln die meisten std::vector-Implementationen ihre Kapazität, wenn sie vergrößert werden müssen.

    Man könnte sich auch einen Custom Allocator für std::vector bauen, der z.B. immer das 1.2-fache alloziert, oder einen der den Speicher um einen festen Betrag erweitert, anstatt stumpf zu verdoppeln.
    Das kann aber eine ziemliche Fummelei werden: http://www.josuttis.com/libbook/memory/myalloc.hpp.html



  • Z schrieb:

    Athar schrieb:

    IIRC verdoppeln die meisten std::vector-Implementationen ihre Kapazität, wenn sie vergrößert werden müssen.

    Man könnte sich auch einen Custom Allocator für std::vector bauen, der z.B. immer das 1.2-fache alloziert, oder einen der den Speicher um einen festen Betrag erweitert, anstatt stumpf zu verdoppeln.
    Das kann aber eine ziemliche Fummelei werden: http://www.josuttis.com/libbook/memory/myalloc.hpp.html

    Damit kann man doch nicht die Allokationsstrategie verändern?
    Aber statt den Speicher mit new zu besorgen, kann man z.B. an der Stelle dafür sorgen, dass memory mapped files verwendet werden.



  • Athar schrieb:

    Damit kann man doch nicht die Allokationsstrategie verändern?
    Aber statt den Speicher mit new zu besorgen, kann man z.B. an der Stelle dafür sorgen, dass memory mapped files verwendet werden.

    Doch. Mit einem eigenen Allokator hat man IMHO alle Möglichkeiten. Aber berichtigt mich, wenn ich falsch liegen sollte.


Anmelden zum Antworten