Zu wenig Speicher Problem

0

Ich führe ein C ++ - Programm in Ubuntu 10.04 (32-Bit-Systemarchitektur) aus. Wenn ich die Speicherkapazität berechne, die mein Programm verwendet, beläuft sich diese auf 800 MB. Ich habe einen 4GB RAM. Aber noch bevor das Programm beendet ist, gibt es eine Speicherausnahme. Warum passiert das? Liegt es an der Struktur des Speichers oder an Implementierungsproblemen oder was könnte dieses Problem möglicherweise auslösen? Ich habe dieses Problem schon einige Male gesehen, aber den Grund dafür nie verstanden. Hat jemand von euch diesen Fall schon einmal behandelt?

Aktualisieren:

Das Programm, das ich ausführen möchte, ist hier mit Erläuterungen. Um die Größe des von mir verwendeten Speichers zu erhöhen, erhöhe ich einfach den Wert max_iin der Hauptfunktion.

0x0
quelle
Was ist Ihre Systemarchitektur - 32bit oder 64bit? Wenn Sie über 32-Bit verfügen, sind Sie trotz des insgesamt installierten Arbeitsspeichers auf 2 GB pro Prozessspeicher beschränkt. Wenn Sie eine 64-Bit-Architektur, aber eine ausführbare 32-Bit-Datei haben, stoßen Sie auf dieselbe Einschränkung. Es gibt andere Einschränkungen, z. B. die von festgelegten Benutzerspeicherbeschränkungen ulimit.
mbaitoff
@mbaitoff: Es ist 32 Bit.
0x0
2
Dann sind Sie bis zu 2 GB. Bitte haben Sie jedoch Verständnis dafür, dass dies die theoretisch maximal für Ihre Anwendung verfügbare Speichermenge ist. Dies bedeutet nicht, dass Sie 1 GB Speicherplatz auf einmal zuweisen können. Vorherige Zuweisungen und Freigabezuweisungen haben den Heap möglicherweise fragmentiert. Daher kann es vorkommen, dass Ihre Zuweisungsanforderung auch dann fehlschlägt, wenn mehr Speicher verfügbar ist als angefordert. Außerdem sollten Sie Debug-Informationen zu einem Zuweisungsversuch haben, der zu einer Speichermangel-Situation geführt hat - überprüfen Sie diese.
Mbaitoff
In meinem Programm habe ich für nichts die Zuweisung aufgehoben oder Destruktor aufgerufen, hauptsächlich, weil ich mir hauptsächlich Sorgen darüber mache, wie die Speicherzuweisung funktioniert und ich überprüfen möchte, wie viel Speicher mein Programm belegen kann. Ich habe auch einige gelesen, in denen der Speicher in einer Heap-Struktur zugewiesen ist. Nun, da Sie Haufen erwähnt haben. Können Sie das näher erläutern?
0x0
1
Ich denke, nichts könnte getan werden, bis wir den magischen Teil eines Programms sehen, das versucht, zuzuweisen und fehlschlägt.
Mbaitoff

Antworten:

0

Dinge, die schief gehen könnten:

  • Das System ist nicht in der Lage, Ihnen X Bytes kontinuierlichen Speicherplatz zuzuweisen. Nehmen wir an, Sie möchten einen Block mit 512 MB, aber das System kann einen so großen, zusammenhängenden Block nicht finden. Dann haben Sie Pech und bekommen eine "Out of Memory" -Ausnahme

  • Sie berechnen die Menge an Speicher falsch, die Ihr Programm tatsächlich benötigt. Geben Sie nicht verwendeten Speicher frei? Haben Sie den Overhead für einige Strukturen (Keyword Alignment) korrekt berechnet?

  • Haben Sie eine ausreichend große Auslagerungsdatei, damit das System andere Prozesse auslagern kann?

Akira
quelle
Ich habe nichts freigegeben und bin mir ziemlich sicher, dass ich den Speicher berechnet habe, der ordnungsgemäß verwendet wird. Können Sie etwas mehr über den Tausch erklären? Ich bin daran interessiert zu wissen, wie das Austauschen von Speicher im Allgemeinen funktioniert.
0x0
0

Wir brauchen mehr Informationen. Es scheint, als würden Sie ein Experiment durchführen, das cool ist, aber was macht das Programm tatsächlich?

Weisen Sie Tausende kleiner Speicherbereiche oder einige große fortlaufende Bereiche usw. zu?

Die Frage grenzt an Stackoverflow-Eignung IMO.

Wie die anderen Leute vermuten, befinden Sie sich in einer 32-Bit-Umgebung und Ihr Prozess könnte Probleme haben, einen großen Teil auf einmal zuzuweisen. Aber ich spekuliere nur ohne weitere Details.

Andy
quelle
Ich versuche, eine große Menge kleiner Stücke zuzuweisen. Angenommen, ich habe in einem meiner Experimente eine Klasse definiert und eine große Anzahl von Instanzen der Klasse mithilfe einer verschachtelten for-Schleife erstellt. Grundsätzlich versuche ich zu analysieren, wie viel Speicher durch einen Prozess belegt werden kann, bei dem große Mengen kleiner Chunks und kleine Mengen großer Chunks vorhanden sind. Ich verstehe die Zuordnung nicht.
0x0