IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Windows7x64 : garder de la ram pour Python


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut Windows7x64 : garder de la ram pour Python
    Bonjour,

    J'ai un script python (en exe avec py2exe) qui tourne en permanence sur des machines. Tout marche très bien, sauf quand on lance une autre appli qui prend toute la ram disponible. A ce moment là, mon exe python a moins de ram, genre de 20Mo il passe à 4Mo. Et là certaines fonctions marchent toujours, mon exe tourne donc, mais d'autres fonctions, notamment écouter sur un port tcp pour recevoir des commandes (avec zmq), ne marche plus.

    Alors peut-on réserver de la ram ? Ou empêcher windows de bouffer la ram de mon exe python ?

    Le tout en win7x64, python 2.7 x64

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 428
    Points : 37 010
    Points
    37 010
    Par défaut
    Salut,
    Et là certaines fonctions marchent toujours, mon exe tourne donc, mais d'autres fonctions, notamment écouter sur un port tcp pour recevoir des commandes (avec zmq), ne marche plus.
    La lenteur devrait faire péter des timers. Si c'est "autre chose", il y a peut être un autre problème (et un autre diagnostic à faire).

    Alors peut-on réserver de la ram ? Ou empêcher windows de bouffer la ram de mon exe python ?
    RAM, CPU, ... sont des ressources gérées par Windows.
    Par défaut, une application (Python ou pas) laisse faire l'OS.
    Pour changer ce défaut, il faut trouver comment raconter cela à l'OS (ce sont des appels systèmes).
    Attention à la petite notice concernant JOB_OBJECT_LIMIT_WORKINGSET.

    Puis appeler cela depuis Python via ctypes ou win32 is just SMOP.
    Désolé mais lire la doc, trouver comment tester que le code "fonctionne", puis coder, tester,... prend beaucoup plus de temps que de faire un plan de route. Peut être que d'autres ont ce genre de code dans un coin et seront ravis de le partager.

    - W

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Merci !!!! J'entrevois au moins une solution avec SetProcessWorkingSetSizeEx , je vais essayer çà !
    Je vous tiens au courant, mais en attendant si qqlun a déjà bossé là dessus çà m’intéresse

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    J'ai çà qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import win32process
     
    hdl = win32process.GetCurrentProcess()
    minSize, maxSize = win32process.GetProcessWorkingSetSize(hdl)
    print minSize, maxSize 
     
    win32process.SetProcessWorkingSetSize(hdl, 1413120, 1413120)
    minSize, maxSize = win32process.GetProcessWorkingSetSize(hdl)
    print minSize, maxSize
    reste à comprendre quelles valeurs mettre (14Mo ??) et verifier si çà change quelques chose lol

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    bon en gros :
    SetProcessWorkingSetSizeEx is only available in Vista and higher.
    SetProcessWorkingSetSize doesn't establish a hard limit on the working set.

    Donc la soluce au dessus ne marche pas, j'ai testé et la ram descend en dessous du min ...

    Je vais essayer en appellant la fonction dans kernel32.dll ... :/

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 428
    Points : 37 010
    Points
    37 010
    Par défaut
    (re-)Read the fine print que j'ai écrit: "Attention à la petite notice concernant JOB_OBJECT_LIMIT_WORKINGSET", elle explique ce que vous constatez.
    - W

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    ouch je suis largué là !

    J'ai essayé çà mais impossible d'avoir qql chose, j'ai des erreurs 6 (access denied):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    import time, os
     
    import win32process
    from ctypes import *
     
    #hProcess = win32process.GetCurrentProcess()
    hProcess = os.getpid()
    #print hProcess
     
    print windll.Kernel32.GetProcessWorkingSetSizeEx(hProcess)
    print "errorcode:", windll.Kernel32.GetLastError()
     
    windll.kernel32.SetProcessWorkingSetSizeEx(hProcess, 12288000, 24576000, 0x00000001)
    print "errorcode:", windll.Kernel32.GetLastError()

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Bon désolé mais j'y connais rien en ctypes, çà dépasse mes compétences, j'ai passé la journée dessus et nada. J'ai des code d'erreur 0 donc command successful, mais çà change rien. Je cherche donc une autre solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    from ctypes import windll
     
    PROCESS_ALL_ACCESS = 0x1F0FFF
    PROCESS_QUERY_INFORMATION = 0x0400
    PROCESS_VM_READ = 0x0010
     
    pid = os.getpid()
    hProcess = windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS, 0, pid)
     
    get = windll.kernel32.GetProcessWorkingSetSizeEx(hProcess)
     
    print get, type(get)
    print "errorcode:", windll.Kernel32.GetLastError()
     
    windll.kernel32.SetProcessWorkingSetSizeEx(hProcess, 12288000, 24576000, 0x00000001)
    print "errorcode:", windll.Kernel32.GetLastError()

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Pourquoi ne pas changer la priorité ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import win32process
    import win32api
    win32process.SetPriorityClass(win32api.GetCurrentProcess(),  win32process.HIGH_PRIORITY_CLASS)
    # win32process.SetThreadPriority(win32api.GetCurrentThread(), win32process.THREAD_PRIORITY_HIGHEST)
    Rien pour tester donc a vous de voir.

    @+

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    C'est déjà ce que je fais mais çà ne suffit pas.
    C'est peu être lié au fait que j'ai 2 threads ?

    http://www.developpez.net/forums/d13...orite-threads/

Discussions similaires

  1. y a-t-il un support de types génériques pour python ?
    Par silverhawk.os dans le forum Général Python
    Réponses: 15
    Dernier message: 24/03/2006, 19h23
  2. Réponses: 16
    Dernier message: 01/02/2006, 23h05
  3. Librairie 7z Pour Python
    Par kedare dans le forum Général Python
    Réponses: 2
    Dernier message: 19/12/2005, 16h49
  4. module .so pour python... ?!
    Par totoetlititi dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 09/03/2004, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo