Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  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 : 6
    Points
    6

    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
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 238
    Points : 7 251
    Points
    7 251

    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 : 6
    Points
    6

    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 : 6
    Points
    6

    Par défaut

    J'ai çà qui fonctionne :

    Code :
    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 : 6
    Points
    6

    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
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 238
    Points : 7 251
    Points
    7 251

    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 : 6
    Points
    6

    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 :
    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 : 6
    Points
    6

    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 :
    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 Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrice BLANGARIN
    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 720
    Points : 3 599
    Points
    3 599

    Par défaut

    Bonsoir,

    Pourquoi ne pas changer la priorité ?
    Code :
    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 : 6
    Points
    6

    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/

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •