J'écris parfois des programmes Python qui sont très difficiles à déterminer combien de mémoire il utilisera avant l'exécution. En tant que tel, j'appelle parfois un programme Python qui essaie d'allouer des quantités massives de RAM provoquant l'échange lourd du noyau et dégrader les performances des autres processus en cours d'exécution. Pour cette raison, je souhaite limiter la quantité de mémoire qu'un tas Python peut croître. Lorsque la limite est atteinte, le programme peut simplement tomber en panne. Quelle est la meilleure façon de faire cela? Si cela est important, beaucoup de code est écrit en Cython, donc cela devrait prendre en compte la mémoire qui y est allouée. Je ne suis pas marié à une pure solution Python (elle n'a pas besoin d'être portable), donc tout ce qui fonctionne sur Linux est bien.Comment limiter la taille du tas?
Répondre
Découvrez resource.setrlimit(). Cela ne fonctionne que sur les systèmes Unix, mais il semble que ce soit ce que vous recherchez, car vous pouvez choisir une taille de segment maximale pour votre processus et les enfants de votre processus avec le paramètre resource.RLIMIT_DATA.
EDIT: Ajout d'un exemple:
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
Je ne suis pas sûr de ce que votre cas d'utilisation est exactement, mais il est possible que vous devez placer une limite sur la taille de la pile à la place avec resouce.RLIMIT_STACK. Passer cette limite enverra un signal SIGSEGV à votre processus, et pour le gérer, vous devrez utiliser une pile de signaux alternative comme décrit dans le setrlimit Linux manpage. Je ne suis pas sûr si sigaltstack est implémenté en python, donc, cela pourrait s'avérer difficile si vous voulez récupérer d'aller au-delà de cette limite.
Pouvez-vous donner un exemple? J'ai essayé de définir des limites de ressources, mais j'étais toujours capable d'allouer une liste de gigaoctets. Le module de ressources "se sent bien", mais je ne peux pas le faire fonctionner sur Linux. – carl
J'ai ajouté mon test à la question. Ma compréhension est que le programme Python devrait quitter une fois la limite est atteinte. – carl
Aussi, je me fiche de ce qui se passe si la limite est atteinte - le programme peut tomber en panne, se bloquer, ou autre, aussi longtemps qu'il n'alloue pas plus de mémoire. – carl
Jetez un oeil à ulimit. Il permet de définir des quotas de ressources. Peut nécessiter des paramètres de noyau appropriés.
Lorsque vous utilisez PAM de toute façon, '/ etc/security/limits.conf' est le meilleur endroit pour fixer des limites. 'ulimit' est seulement une fonction shell Bash. –
ulimit utilise les mêmes appels système que le module de ressources Python – Willem
- 1. VS2005: Limiter la taille du tas
- 2. Limiter la taille du tas géré dans une application C#
- 3. -Xms: taille initiale du tas ou taille minimale du tas?
- 4. comment choisir la taille du tas jvm?
- 5. Comment limiter la taille du téléchargement?
- 6. Limiter la taille UITextField
- 7. Limiter la taille du répertoire cache
- 8. Suivi taille du tas Eclipse-plugin * programatically *
- 9. Taille initiale du tas Tomcat 5.5
- 10. curl: Comment limiter la taille de GET?
- 11. Comment limiter la taille d'une table?
- 12. Java tas d'espace dans netbeans .. mais j'ai déjà augmenté la taille du tas!
- 13. Limiter l'empreinte de tas de la console Java?
- 14. Java tas taille dans JMP
- 15. Taille du tas Java: erreur lors du réglage trop grand
- 16. limiter la création d'objet sur tas et pile en C++
- 17. Limiter la taille d'un contrôle utilisateur au moment du design
- 18. Comment limiter la taille de rightBarButtonItem à UINavigationBar?
- 19. Comment limiter la taille de l'historique de HtmlUnit?
- 20. Taille du tas de démarrage par défaut sous Linux?
- 21. Limiter la taille d'une table mysql
- 22. Quelle taille de tas préférez-vous?
- 23. Taille de tas personnalisée dans la plate-forme Android?
- 24. Comment limiter la taille d'une requête Net :: HTTP?
- 25. Comment régler la taille du tas min/max pour le conteneur osgi d'équinoxe
- 26. Problèmes avec l'espace java heap, comment augmenter la taille du tas?
- 27. Taille de tas commise vs réservée.
- 28. quelle est la taille de tas de l'application dans l'iphone?
- 29. La taille maximale du tas du serveur Tomcat (valeur -Xmx) est modifiée pendant l'exécution de Tomcat?
- 30. J'ai du mal à limiter la taille du téléchargement de la fonction cURL de PHP
Je suis confus à propos de cette question. Il semble inclure une réponse, mais n'indique pas ce qui ne va pas. – amcnabb
On dirait qu'il a copié le code de la réponse acceptée dans sa question. Vraisemblablement c'est la solution? – fantabolous
@amcnabb J'ai supprimé la réponse à la question – Djizeus