Maximale Heapgröße ändern



  • Hallo,
    ich hoffe mal, die Frage passt in diese Kategorie...
    Ich habe ein Programm, in dem ich ein sehr großes Array benutzen möchte. Irgendwann bekomme ich allerdings

    terminate called after throwing an instance of 'std::bad_alloc'
    what(): std::bad_alloc
    Aborted

    oder einfach nur

    Killed

    Kann man die maximale Heapgröße manipulieren oder gibt es sonst irgendwelche Tricks?

    Ich benutze C++ / g++ / Ubuntu10.04 32bit

    Viele Grüße



  • Nur zur Sicherheit vorweg: Belegst du wirklich mit new[] Speicher auf dem Heap oder hast du ein Array auf dem Stack?

    Du kannst theoretisch beliebig viel Speicher auf dem Heap anfordern. Das Betriebssystem gibt dir nur irgendwann ne Sperre, was bei deinem 32-Bit-OS schon relativ früh sein sollte (1 GB vielleicht? Vorsicht, Halbwissen). Als Erstes würd ich mir an deiner Stelle überlegen, ob so ein großes Array wirklich notwendig ist. Was ist denn der Verwendungszweck? Wenn du dann zu dem Schluss kommst, dass die Größe nicht sinnvoll verringert werden kann, kannst du versuchen , den Speicher über mehrere kleinere Allokationen zu erhalten, denn wenn du alles an einem Stück allokierst, muss auch ein entsprechend großes Stück im Freispeicher an einem Stück frei sein.



  • Du könntest die std::deque konsultieren, die teilt den Speicher in mehrere Blöcke auf (anders als std::vector, der alles an einem Stück hat).

    @Michael E: bad_alloc kommt nur bei new, also nix mit Stack.



  • Dachdecker schrieb:

    @Michael E: bad_alloc kommt nur bei new, also nix mit Stack.

    Bezieht sich auf "oder einfach nur 'killed'".



  • Danke für den Tipp mit std::deque. Weiß jemand genauer, wo vom Betriebssystem her die Grenze bzgl der Größe besteht?



  • Meiner Meinung nach ist std::deque nicht für viele kleine Elemente geeignet, da die Blöcke relativ klein sind und durch die Verwaltungsinformationen ein relativ großer Overhead entsteht. Ich hab´s mir vor längerer Zeit mit den STL Implementationen von SGI und Dinkumware angeguckt, da ist der Speicherverbrauch förmlich explodiert.



  • xrismf schrieb:

    Weiß jemand genauer, wo vom Betriebssystem her die Grenze bzgl der Größe besteht?

    Das ist auf Unixen konfigurierbar. "ulinmit -a" zeigt dir die aktuelle Konfiguration an. Wenn dein 32-Bit Ubuntu kein PAE-Kernel ist, gibt's natürlich noch die 4GB Grenze. In einem Ubuntu-Forum kann man dir bestimmt mehr sagen.



  • Danke, werde eich tun 🙂



  • DocShoe schrieb:

    Meiner Meinung nach ist std::deque nicht für viele kleine Elemente geeignet, da die Blöcke relativ klein sind und durch die Verwaltungsinformationen ein relativ großer Overhead entsteht.

    Meinst du nicht std::list ? Zur std::deque kann ich allerdings wenig Praktisches sagen, da ich sie bisher kaum in kritischen Situationen benutzt habe.

    Zur Not kann man sich auch was wie std::vector< std::vector<T> > basteln und schön kapseln.


Anmelden zum Antworten