2015-05-15 25 views
20

Ich habe Python 2.7 auf einem Linux-Rechner mit 16 GB RAM und 64-Bit-Betriebssystem. Ein Python-Skript, das ich geschrieben habe, kann zu viele Daten in den Speicher laden, was die Maschine so verlangsamt, dass ich den Prozess nicht mehr beenden kann.Speicherverbrauch begrenzen?

Während ich Speicher durch den Aufruf begrenzen:

ulimit -v 12000000 

in meiner Schale, bevor Sie das Skript ausgeführt wird, würde Ich mag eine Begrenzung Option im Skript selbst aufzunehmen. Überall, wo ich hinsah, wird das Modul resource mit der gleichen Leistung wie ulimit zitiert. Aber rufen:

import resource 
_, hard = resource.getrlimit(resource.RLIMIT_DATA) 
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard)) 

am Anfang meines Skripts tut absolut nichts. Selbst wenn der Wert so niedrig wie 12000 gesetzt wurde, stürzte der Prozess nie ab. Ich habe das gleiche mit RLIMIT_STACK versucht, auch mit dem gleichen Ergebnis. Seltsamerweise ruft:

import subprocess 
subprocess.call('ulimit -v 12000', shell=True) 

tut auch nichts.

Was mache ich falsch? Ich konnte keine tatsächlichen Anwendungsbeispiele online finden.

+0

Gibt es einen Platz, um das Programm speichereffizienter zu machen? – TigerhawkT3

+1

Es gibt, aber das wird eine Weile dauern. Im Moment muss ich es testen und sicherstellen, dass es den Computer nicht herunterfährt. Und eine Ausfallsicherung für den Speicher wird auch später nützlich sein. – Arne

+1

Da es in Python 2.7 ist, wie wäre es mit Python 3 und einem 2-zu-3-Konverter in Ihrem Programm? Python 3 hat einige Leistungsverbesserungen gegenüber Python 2, von denen einige speicherbezogen sind. – TigerhawkT3

Antwort

12

resource.RLIMIT_VMEM ist die Ressource corresponding to ulimit -v.

RLIMIT_DATAonly affects brk/sbrk system calls während newer memory managers tend to use mmap instead.

Die zweite Sache zu beachten ist, dass ulimit/setrlimit nur den aktuellen Prozess und seine zukünftigen Kinder betrifft.

In Bezug auf die AttributeError: 'module' object has no attribute 'RLIMIT_VMEM' Nachricht: die resource module docs diese Möglichkeit erwähnen:

This module does not attempt to mask platform differences — symbols not defined for a platform will not be available from this module on that platform.

Nach dem bashulimit source oben verbunden, verwendet es RLIMIT_AS wenn RLIMIT_VMEM nicht definiert ist.

+1

Ich benutze kein Multithreading, also hoffe ich, dass das nicht das Problem ist. Aber wenn ich 'RLIMIT_DATA' eingeben, bekomme ich folgende Fehlermeldung: ' Traceback (jüngste Aufforderung zuletzt): File "my_script.py", Linie 417, in sys.exit (main()) Datei "mein_script.py ", Zeile 391, in Haupt _, hart = resource.getrlimit (resource.RLIMIT_VMEM) AttributError: 'Modul' Objekt hat kein Attribut 'RLIMIT_VMEM'' Von der Liste, die Sie referenzierten, konnten alle Felder gefunden werden - außer Ich versuche es jetzt mit Python 3.x zu tun .. – Arne

+0

Danke für die Klarstellung! – Arne