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 ...
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))
où 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! =)
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