p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Invité régulier
    Inscrit en
    août 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 39
    Points : 7
    Points
    7

    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
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 601
    Points : 10 168
    Points
    10 168

    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
    Architectures Post-Modernes

  3. #3
    Invité régulier
    Inscrit en
    août 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 39
    Points : 7
    Points
    7

    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
    Invité régulier
    Inscrit en
    août 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 39
    Points : 7
    Points
    7

    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
    Invité régulier
    Inscrit en
    août 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 39
    Points : 7
    Points
    7

    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
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    6 601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 6 601
    Points : 10 168
    Points
    10 168

    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
    Architectures Post-Modernes

  7. #7
    Invité régulier
    Inscrit en
    août 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 39
    Points : 7
    Points
    7

    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
    Invité régulier
    Inscrit en
    août 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 39
    Points : 7
    Points
    7

    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 722
    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 722
    Points : 3 958
    Points
    3 958

    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.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  10. #10
    Invité régulier
    Inscrit en
    août 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 39
    Points : 7
    Points
    7

    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, 18h23
  2. Réponses: 16
    Dernier message: 01/02/2006, 22h05
  3. Librairie 7z Pour Python
    Par kedare dans le forum Général Python
    Réponses: 2
    Dernier message: 19/12/2005, 15h49
  4. module .so pour python... ?!
    Par totoetlititi dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 09/03/2004, 14h51

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