2010-02-22 18 views
45

Ich schreibe manchmal Python-Programme, bei denen es sehr schwierig ist, zu bestimmen, wie viel Speicher sie vor der Ausführung verwenden werden. Daher rufe ich manchmal ein Python-Programm auf, das versucht, riesige Mengen an RAM zuzuordnen, was dazu führt, dass der Kernel die Leistung anderer laufender Prozesse stark vertauscht und verschlechtert.Wie die Größe des Heap zu begrenzen?

Aus diesem Grund möchte ich beschränken, wie viel Speicher ein Python-Heap wachsen kann. Wenn das Limit erreicht ist, kann das Programm einfach abstürzen. Was ist der beste Weg, dies zu tun?

Wenn es darauf ankommt, wird viel Code in Cython geschrieben, daher sollte dort der dort zugewiesene Speicher berücksichtigt werden. Ich bin nicht mit einer reinen Python-Lösung verheiratet (es muss nicht portabel sein), also ist alles, was unter Linux funktioniert, in Ordnung.

+4

Ich bin verwirrt über diese Frage. Es scheint eine Antwort zu enthalten, zeigt aber nicht an, was damit nicht stimmt. – amcnabb

+0

Sieht aus, als hätte er den Code der akzeptierten Antwort in seine Frage kopiert. Vermutlich ist es die Lösung? – fantabolous

+0

@amcnabb Ich entfernte die Antwort von der Frage – Djizeus

Antwort

45

Auschecken resource.setrlimit(). Es funktioniert nur auf Unix-Systemen, aber es scheint so, als ob es das sein könnte, wonach Sie suchen, da Sie mit dem Parameter resource.RLIMIT_DATA eine maximale Heap-Größe für Ihren Prozess und die untergeordneten Prozesse Ihres Prozesses auswählen können.

EDIT: Hinzufügen ein Beispiel:

import resource 

rsrc = resource.RLIMIT_DATA 
soft, hard = resource.getrlimit(rsrc) 
print 'Soft limit starts as :', soft 

resource.setrlimit(rsrc, (1024, hard)) #limit to one kilobyte 

soft, hard = resource.getrlimit(rsrc) 
print 'Soft limit changed to :', soft 

Ich bin mir nicht sicher, was Ihr Anwendungsfall genau ist, aber es ist möglich, dass Sie eine Obergrenze für die Größe des Stapels statt mit resouce.RLIMIT_STACK platzieren müssen. Wenn Sie diese Grenze überschreiten, wird ein SIGSEGV-Signal an Ihren Prozess gesendet. Um dies zu bewerkstelligen, müssen Sie einen alternativen Signalstapel verwenden, wie in der Setrimit Linux manpage beschrieben. Ich bin mir nicht sicher, ob Sigaltstack in Python implementiert ist, also könnte es sich als schwierig erweisen, wenn Sie sich davon erholen wollen, diese Grenze zu überschreiten.

+3

Können Sie ein Beispiel geben? Ich habe versucht, verschiedene Ressourcenlimits zu setzen, aber ich konnte immer noch eine Gigabyte-Liste zuordnen. Das Ressourcenmodul "fühlt sich gut an", aber ich kann es nicht mit Linux arbeiten. – carl

+0

Ich habe meinen Test zu der Frage hinzugefügt. Mein Verständnis ist, dass das Python-Programm beendet werden sollte, sobald das Limit erreicht ist. – carl

+2

Es ist mir auch egal, was passiert, wenn das Limit erreicht wird - das Programm kann abstürzen, hängen oder was auch immer, solange es nicht mehr Speicher reserviert. – carl

0

Werfen Sie einen Blick auf ulimit. Es ermöglicht die Festlegung von Ressourcenkontingenten. Kann auch geeignete Kernel-Einstellungen benötigen.

+0

Wenn Sie PAM sowieso verwenden, '/ etc/security/limits.conf' ist der bessere Ort, um Grenzen zu setzen. 'ulimit' ist nur eine Bash-Shell-Funktion. –

+0

ulimit verwendet dieselben Systemaufrufe wie das Python-Ressourcenmodul – Willem

Verwandte Themen