Out of Memory



  • Hallo,

    Mein Programm benötigt sehr viel Speicher. Bei grösseren Datenmengen erhalte ich die Fehlermeldung:

    *** set a breakpoint in malloc_error_break to debug
    main(3288,0xa0375720) malloc: *** mmap(size=16777216) failed (error code=12)
    *** error: can't allocate region

    ... also dass kein weiterer Speicher mehr reserviert werden kann.

    Ich frage mich nun aber warum das auftritt. Sollte das Betriebssystem ( in meinem Fall Mac OS Leopard ) dann den RAM speicher nicht automatisch auf die Festplatte auslagern?



  • Falls dein Programm mit 32-Bit läuft: Evtl reicht der Adress-Raum nicht (bis 4GB, meist noch abzüglich ein paar hundert MB für's OS)?

    edit: Ansonsten mal nach dem Fehlercode und der Fehlermeldung gegoogelt?



  • Badestrand schrieb:

    Falls dein Programm mit 32-Bit läuft: Evtl reicht der Adress-Raum nicht (bis 4GB, meist noch abzüglich ein paar hundert MB für's OS)?

    ..klar. hätte ich auch selbst auf die idee kommen können 🙂
    Das ganze läuft als 32bit.. da wird das Problem liegen.



  • Wie beschrieben braucht mein Programm sehr viel Speicher.

    Habt ihr Vorschläge wie man bewerkstelligen könnte damit trotzdem umzugehen?

    Eine Variante wäre bestimmt das Programm auf 64Bit zu portieren.
    Allerdings habe ich davon keine Ahnung. Hat jemand von euch einen guten Link zu einem Tutorial oder allg. Regeln für Umstellung auf 64Bit.

    Oder andere Vorschläge wie mit dem grossen Speicherbedarf umzugehen ist?



  • vittel schrieb:

    Oder andere Vorschläge wie mit dem grossen Speicherbedarf umzugehen ist?

    Die erste Frage ist natürlich ob wirklich alle Daten im Speicher bereitstehen müssen. So kann man z.B. Dateien auch ausschnittsweise betrachten und immer nur mit diesen Ausschnitt arbeiten [unter Windows: Filemapping]...



  • Ja, es müssen alle Daten im Speicher bereit stehen.
    ( Es handelt sich um ein Optimierungsproblem, das global gelöst werden soll. )



  • vittel schrieb:

    Eine Variante wäre bestimmt das Programm auf 64Bit zu portieren.
    Allerdings habe ich davon keine Ahnung. Hat jemand von euch einen guten Link zu einem Tutorial oder allg. Regeln für Umstellung auf 64Bit.

    Für den Umstieg auf 64 bit brauchst du eine 64Bit-Plattform und einen entsprechenden Compiler. Das löst aber eher nicht das Problem, dass du Unmengen an Speicher verbraten willst, die du vermutlich nichtmal brauchst (zumindest halte ichs für höchst unwahrscheinlihc, wenn du nicht grade LHC-Daten auswerten willst oder etwas in der Art).

    vittel schrieb:

    Oder andere Vorschläge wie mit dem grossen Speicherbedarf umzugehen ist?

    Indem du den Speicherbedarf reduzierst, z.B. unnötige Kopien vermeidest etc. Eventuell kann dir dein Profiler sagen wo du so viel Speicher verbrätst und wo du das etwas reduzieren kannst. Ohne das Problem zu kennen kann dir auf die Schnelle hier wohl keiner genauer helfen.



  • Wieviel Speicher braucht denn dein Programm?



  • Ich habe 4GB Ram, je nachdem was sonst noch läuft bricht das Programm nach 1 - 2.5GB ab.

    Es handelt sich um einen Graphen mit mehreren 100 Millionen Nodes und ein vielfaches an Kanten.



  • vittel schrieb:

    Es handelt sich um einen Graphen mit mehreren 100 Millionen Nodes und ein vielfaches an Kanten.

    Verkleinere dein Problem, lager auf Disk aus oder "portier'" auf 64 Bit.



  • hustbaer schrieb:

    vittel schrieb:

    Es handelt sich um einen Graphen mit mehreren 100 Millionen Nodes und ein vielfaches an Kanten.

    Verkleinere dein Problem, lager auf Disk aus oder "portier'" auf 64 Bit.

    Wie kann ich auf Disk auslagern?

    ( Hab soeben mal ausgerechnet dass ich ca. 6.5GB Ram bräuchte .. )



  • Erklär mal genauer was du machen willst. Bei vielen Graphenalgorithmen musst du nicht den kompletten Graph im Hauptspeicher haben. Du kannst zum Beispiel Nodes "exploden" und das was dich nicht mehr interessiert "vergessen". Wie gesagt, hängt davon ab, was du machen willst.



  • Es handelt sich um einen GraphCut Algo. Damit möchte ich Videos segmentieren. (Also z.b. 250 Frames à Breite x Höhe = 700 x 500 Pixel ergibt nicht ganz 100Millionen Nodes und in einer 6Nachbarschaft im ungerichteten Fall etwas weniger als 300Millionen Kanten. ) Der verwendete Code ist hier zu finden: http://www.csd.uwo.ca/faculty/yuri/Implementations/maxflow-v3.0.src.tar.gz


Anmelden zum Antworten