web-dev-qa-db-fra.com

Limitez l'utilisation de RAM à python

J'essaie de limiter l'utilisation de RAM à partir d'un programme Python) afin qu'il ne se bloque pas totalement lorsque tous les RAM est utilisé, pour cela j'utilise le code suivant qui ne fonctionne pas et mon ordinateur portable est toujours gelé:

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 à partir de la fonction main.

Qu'est-ce que je fais mal?

Merci d'avance.

PD: J'ai déjà cherché à ce sujet et trouvé le code que j'ai mis mais cela ne fonctionne toujours pas ...

17
Ulises CT

Ok donc j'ai fait quelques recherches et trouvé une fonction pour obtenir la mémoire des systèmes Linux ici: Déterminez free RAM en Python et je l'ai un peu modifiée pour obtenir juste la mémoire libre disponible et définissez 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 la met à la moitié (c'est en octets).

J'espère que cela pourra aider d'autres à l'avenir avec la même affaire! =)

17
Ulises CT

en raison de https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da77

il vaut mieux utiliser:

if str(sline[0]) == 'MemAvailable:':
            free_memory = int(sline[1])
            break

le code de réponse m'a fourni 8 Go de mem disponible sur une machine avec 1 To de RAM

1
The_Pingu