Wann MemoryError in Python abgefangen werden soll?

9

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

    
Akavall 30.03.2014, 01:19
quelle

2 Antworten

1

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 .

    
Mr. A 01.04.2014 13:52
quelle
0

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.

    
Mr. A 31.03.2014 06:53
quelle

Tags und Links