Ich versuche zu verstehen, wann es Sinn macht, MemoryError
in Python zu fangen, ich habe zwei Szenarien:
Szenario 1: MemoryError wurde erfolgreich abgefangen.
%Vor%Szenario 2: Mein Programm friert ein
%Vor% Meine Vermutung ist im ersten Fall, Python "weiß", wie viel Speicher zugewiesen werden müsste, und löst daher eine MemoryError
Ausnahme aus. Während im zweiten Fall Python nicht "weiß", wie groß ich beabsichtige, silly
zu sein. % Co_de% ist jedoch ein dynamisches Array ; Daher sollte Python wissen, dass die Erweiterung dieses Arrays um einen bestimmten Betrag zu einem list
führen würde. Warum wird die Ausnahme dann nicht ausgelöst?
Ich habe mir diese Frage angesehen, und der relevante Absatz aus der Dokumentation lautet:
Ausnahme MemoryError
Wird ausgelöst, wenn eine Operation nicht genügend Arbeitsspeicher hat, die Situation jedoch trotzdem gerettet werden kann (durch Löschen einiger Objekte). Der zugehörige Wert ist a String, der anzeigt, welche Art von (interner) Operation nicht mehr zur Verfügung steht. Beachten Sie, dass aufgrund der zugrunde liegenden Speicherverwaltungsarchitektur (C malloc () -Funktion), kann der Interpreter nicht immer in der Lage sein sich vollständig von dieser Situation erholen; es erhebt sich dennoch ein Ausnahme, so dass ein Stack-Traceback gedruckt werden kann, falls es zu einem Runaway kommt Programm war die Ursache.
Obwohl mir das half, weiß ich immer noch nicht genau, was vor sich geht, und ich habe keine Ausnahme bekommen, wie die Ärzte zu zeigen scheinen.
Meine Fragen: Schätze ich Szenario 1? Warum wird MemoryError
in Szenario 2 nicht ausgelöst?
Ich benutze Python 2.7.5+, und ich bin auf Ubuntu 13.10
Das MemoryError
wird vom Betriebssystem nicht von Python ausgelöst.
Legacy-Betriebssystem hebt MemoryError sofort an, wenn der Speicher voll ist, wo die meisten neuesten Betriebssysteme versuchen, den Inhalt auf
Festplatte , da Hauptspeicher voll ist und kein Platz für neue Anfragen ist, wenn sie immer noch nicht in Zugewiesener Festplattenspeicher oder die aktuelle Anforderungsgröße überschreitet die Grenze des für diesen bestimmten Prozess zugewiesenen Datenspeicherbereichs in RAM (Hauptspeicher) und erhöht dann MemoryError .
Die MemoryError
, die von OS
ausgelöst wurden, können von Ihrem Python-Programm mit try exception
erfasst werden.
Das MemoryError
wird auch um OS
erhöht, wenn Sie eine Anforderung für Speicher stellen, der das Limit von Main Memory
zum Speichern von Daten überschreitet.
Beispiel: Wenn Sie 512MB RAM verwenden und Ihr Betriebssystem 200MB RAM für Daten und Ruhe für Code zugewiesen hat, werden in diesem 200MB für Ihren Prozess 50MB Speicherplatz zugewiesen und Sie machen eine Anfrage, 100MB zu speichern Überschreitet die Grenze, erhöht OS auch in diesem Szenario MemoryError .
In der Python-Liste ist eine verknüpfte Liste, so dass der Speicher Exception MemoryError
nur ausgelöst wird, wenn das System keinen zusätzlichen Speicher zuweisen kann.
Dieses Szenario tritt nur auf, wenn Ihr RAM (main memory)
bis zu seiner maximalen Ebene genutzt wird. Das meiste Betriebssystem verarbeitet dieses Szenario, indem es weniger Prioritätsdaten nach Hard Disk
verschiebt. Daher erhalten Sie MemoryError
nicht im neuen Betriebssystem, aber es ist besser Handle dies, weil die legacy OS
nicht den oben erwähnten Mechanismus haben, so dass der Programmierer damit umgehen muss.
Tags und Links python memory-management