Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Général Python
Général Python Forum d'entraide sur les fondamentaux du langage Python, syntaxe, POO, bibliothèque standard, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/02/2013, 09h48   #1
kiby56
Invité régulier
 
Inscription : août 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 36
Points : 5
Points : 5
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
kiby56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 12h06   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 710
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 710
Points : 4 547
Points : 4 547
Salut,
Citation:
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).

Citation:
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 12h14   #3
kiby56
Invité régulier
 
Inscription : août 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 36
Points : 5
Points : 5
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
kiby56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 13h25   #4
kiby56
Invité régulier
 
Inscription : août 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 36
Points : 5
Points : 5
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
kiby56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 14h13   #5
kiby56
Invité régulier
 
Inscription : août 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 36
Points : 5
Points : 5
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 ... :/
kiby56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 14h27   #6
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 710
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 710
Points : 4 547
Points : 4 547
(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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 14h53   #7
kiby56
Invité régulier
 
Inscription : août 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 36
Points : 5
Points : 5
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()
kiby56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 17h58   #8
kiby56
Invité régulier
 
Inscription : août 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 36
Points : 5
Points : 5
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()
kiby56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2013, 20h56   #9
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 617
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 617
Points : 3 730
Points : 3 730
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.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 12h59   #10
kiby56
Invité régulier
 
Inscription : août 2008
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 36
Points : 5
Points : 5
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/
kiby56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h34.


 
 
 
 
Partenaires

Hébergement Web