3 Stimmen

C++ Max. RAM-Grenze ändern

Wie kann ich die maximale Größe des Arbeitsspeichers für ein Programm ändern? Mir geht ständig der Speicher aus (nicht der maximale Speicher des Systems, sondern der maximale Speicher von ulimit), und ich möchte die globale Speichergrenze nicht ändern. Ich habe mich umgesehen und gesehen, dass die Funktion vlimit() funktionieren könnte, aber ich bin mir nicht sicher, wie ich sie genau verwenden soll.

Bearbeiten: Ich verwende Linux 2.6.38-11-generic Es handelt sich nicht um ein Speicherleck, ich muss buchstäblich 100k einer bestimmten Klasse zuweisen, es führt kein Weg daran vorbei.

3voto

Sebastian Punkte 4712

Weisen Sie die Objekte auf dem Stack zu und stoßen Sie tatsächlich auf das Stack-Limit?

Schreiben Sie z. B. etwas in der Art:

void SomeFunction() {
    MyObject aobject[100000];
    // do something with myobject
}

Dieses Array wird auf dem Stack abgelegt. Eine bessere Lösung - die die Heap-Allokation für Sie automatisiert - wäre es zu schreiben

void SomeFunction() {
    std::vector<MyObject> veccobject(100000); // 100.000 default constructed objects
    // do something with myobject
}

Wenn Sie aus irgendeinem Grund wirklich einen größeren Stack wollen, konsultieren Sie Ihre Compiler-Dokumentation für das entsprechende Flag:

Wie kann man die Stack-Größe des gcc-Programms erhöhen?

Kann man die Größe des Aufrufstapels in C++ einstellen (vs2008)?

Und das sollten Sie vielleicht in Betracht ziehen:

Wann machen Sie sich Gedanken über die Stapelgröße?

2voto

Adam Wright Punkte 48270

Wenn Ihnen diese Beschränkungen vom Systemadministrator auferlegt werden, dann nein - Sie sitzen fest. Wenn Sie ulimit Sie müssen nur die weichen und harten Grenzen anheben.

Wie Chris in den Kommentaren anmerkte, könnten Sie, wenn Sie ein privilegierter Prozess sind, Folgendes verwenden setrlimit um Ihr hartes Limit im Prozess zu erhöhen. Allerdings geht man davon aus, dass Sie unter einer ulimit dann ist es unwahrscheinlich, dass Sie ein privilegierter Prozess sind.

2voto

Verstehen Sie Warum stoßen Sie an das RAM-Limit? Sind Sie sicher, dass Sie keine Speicherlecks (wenn Sie Lecks haben, benötigen Sie immer mehr RAM, wenn Ihre Anwendung länger läuft).

Wenn Sie einen Linux-Rechner verwenden, können Sie valgrind um Speicherlecks zu finden und zu beheben, und Sie können auch Böhms konservativer Müllsammler um sie oft zu vermeiden.

1voto

Paul Rubel Punkte 25730

Wenn Sie Berechtigungen haben, können Sie die setrlimit Aufruf (der vlimit ablöst), um die Grenzen zu Beginn Ihres Programms festzulegen. Dies wirkt sich nur auf dieses Programm und seine Nachkommen aus.

#include <sys/time.h>
#include <sys/resource.h>

int main() {
  struct rlimit limit;
  limit.rlim_cur = RLIM_INFINITY;
  limit.rlim_max = RLIM_INFINITY;
  if (0 != setrlimit(RLIMIT_AS, &limit)) {
  //errro
  } 
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X