2016-12-12 2 views
4

J'essaie de limiter l'utilisation de la RAM d'un programme Python à la moitié de sorte qu'il ne se fige pas complètement lorsque toute la RAM est utilisée, pour cela j'utilise le code suivant qui n'est pas travail et mon ordinateur portable est en gelant:Limiter l'utilisation de la RAM au programme python

import sys 
import resource 

def memory_limit(): 
    rsrc = resource.RLIMIT_DATA 
    soft, hard = resource.getrlimit(rsrc) 
    soft /= 2 
    resource.setrlimit(rsrc, (soft, hard)) 

if __name__ == '__main__': 
    memory_limit() # Limitates maximun memory usage to half 
    try: 
     main() 
    except MemoryError: 
     sys.stderr.write('MAXIMUM MEMORY EXCEEDED') 
     sys.exit(-1) 

J'utilise d'autres fonctions que j'appelle de la fonction main.

Qu'est-ce que je fais mal?

Merci d'avance.

PD: Je l'ai déjà recherché à ce sujet et a trouvé le code que je l'ai mis, mais il ne fonctionne toujours pas ...

+0

Peut-être que vous voulez 'ulimit' ou' prlimit' en dehors du script Python. Ou configurez une mémoire limitée 'cgroup' et exécutez le script ici. Je ne suis pas sûr d'essayer d'auto-limiter est la meilleure idée - ce qui se passe si le code qui essaie de vérifier ou de faire respecter la limite doit allouer de la mémoire dans le processus? – twalberg

+0

Avez-vous essayé 'soft/= 100', ou soft // = 2? – Gribouillis

+0

si j'utilise que ça dit sorties trop tôt @Gribouillis –

Répondre

2

Ok donc je l'ai fait quelques recherches et a trouvé une fonction pour obtenir la mémoire des systèmes Linux ici: Determine free RAM in Python et je l'ai modifié un peu pour obtenir juste la mémoire libre disponible et définir la mémoire maximale disponible comme sa moitié.

code:

def memory_limit(): 
    soft, hard = resource.getrlimit(resource.RLIMIT_AS) 
    resource.setrlimit(resource.RLIMIT_AS, (get_memory() * 1024/2, hard)) 

def get_memory(): 
    with open('/proc/meminfo', 'r') as mem: 
     free_memory = 0 
     for i in mem: 
      sline = i.split() 
      if str(sline[0]) in ('MemFree:', 'Buffers:', 'Cached:'): 
       free_memory += int(sline[1]) 
    return free_memory 

if __name__ == '__main__': 
    memory_limit() # Limitates maximun memory usage to half 
    try: 
     main() 
    except MemoryError: 
     sys.stderr.write('\n\nERROR: Memory Exception\n') 
     sys.exit(1) 

La ligne pour le mettre à la moitié est resource.setrlimit(resource.RLIMIT_AS, (get_memory() * 1024/2, hard))get_memory() * 1024/2 lui affecte la moitié (il est en octets).

Espérons que cela peut aider les autres à l'avenir avec le même problème! =)