1 #-*-coding:iso-8859-1-*-
3 # Copyright (C) 2008-2011 EDF R&D
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
24 Informations sur le code et la plateforme, et mise à jour des chemins
26 La classe "PlatformInfo" permet de récupérer les informations générales sur
27 le code et la plateforme sous forme de strings, ou d'afficher directement
28 les informations disponibles par les méthodes. L'impression directe d'un
29 objet de cette classe affiche les informations minimales. Par exemple :
31 print PlatformInfo().getVersion()
32 created = PlatformInfo().getDate()
34 La classe "PathManagement" permet de mettre à jour les chemins système pour
35 ajouter les outils numériques, matrices... On l'utilise en instanciant
36 simplement cette classe, sans meme récupérer d'objet :
39 __author__ = "Jean-Philippe ARGAUD"
43 # ==============================================================================
46 Rassemblement des informations sur le code et la plateforme
49 "Retourne le nom de l'application"
54 "Retourne le numéro de la version"
56 return version.version
59 "Retourne la date de création de la version"
63 def getPythonVersion(self):
64 "Retourne la version de python utilisée"
66 return ".".join(map(str,sys.version_info[0:3]))
68 def getNumpyVersion(self):
69 "Retourne la version de numpy utilisée"
71 return numpy.version.version
73 def getScipyVersion(self):
74 "Retourne la version de scipy utilisée"
76 return scipy.version.version
78 def getCurrentMemorySize(self):
79 "Retourne la taille mémoire courante utilisée"
84 return "%s %s (%s)"%(version.name,version.version,version.date)
86 # ==============================================================================
89 Mise à jour du path système pour les répertoires d'outils
93 parent = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
95 self.__paths["daExternals"] = os.path.join(parent,"daExternals")
96 self.__paths["daMatrices"] = os.path.join(parent,"daMatrices")
97 self.__paths["daNumerics"] = os.path.join(parent,"daNumerics")
99 for v in self.__paths.values():
100 sys.path.insert(0, v )
102 # Conserve en unique exemplaire chaque chemin
103 sys.path = list(set(sys.path))
108 Renvoie le dictionnaire des chemins ajoutés
112 # ==============================================================================
115 Permet de récupérer les différentes tailles mémoires du process courant
118 # Le module resource renvoie 0 pour les tailles mémoire. On utilise donc
119 # plutôt : http://code.activestate.com/recipes/286222/ et les infos de
120 # http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/en-US/Reference_Guide/s2-proc-meminfo.html
122 _proc_status = '/proc/%d/status' % os.getpid()
123 _memo_status = '/proc/meminfo'
126 'ko': 1024.0, 'mo': 1024.0*1024.0,
127 'Ko': 1024.0, 'Mo': 1024.0*1024.0,
129 'kB': 1024.0, 'mB': 1024.0*1024.0,
130 'KB': 1024.0, 'MB': 1024.0*1024.0,
136 def _VmA(self, VmKey, unit):
138 t = open(self._memo_status)
142 return 0.0 # non-Linux?
143 i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...'
144 v = v[i:].split(None, 3) # whitespace
146 return 0.0 # invalid format?
147 # convert Vm value to bytes
148 mem = float(v[1]) * self._scale[v[2]]
149 return mem / self._scale[unit]
151 def getAvailablePhysicalMemory(self, unit="o"):
152 "Renvoie la mémoire physique utilisable en octets"
153 return self._VmA('MemTotal:', unit)
155 def getAvailableSwapMemory(self, unit="o"):
156 "Renvoie la mémoire swap utilisable en octets"
157 return self._VmA('SwapTotal:', unit)
159 def getAvailableMemory(self, unit="o"):
160 "Renvoie la mémoire totale (physique+swap) utilisable en octets"
161 return self._VmA('MemTotal:', unit) + self._VmA('SwapTotal:', unit)
163 def getUsableMemory(self, unit="o"):
164 """Renvoie la mémoire utilisable en octets
165 Rq : il n'est pas sûr que ce décompte soit juste...
167 return self._VmA('MemFree:', unit) + self._VmA('SwapFree:', unit) + \
168 self._VmA('Cached:', unit) + self._VmA('SwapCached:', unit)
170 def _VmB(self, VmKey, unit):
172 t = open(self._proc_status)
176 return 0.0 # non-Linux?
177 i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...'
178 v = v[i:].split(None, 3) # whitespace
180 return 0.0 # invalid format?
181 # convert Vm value to bytes
182 mem = float(v[1]) * self._scale[v[2]]
183 return mem / self._scale[unit]
185 def getUsedMemory(self, unit="o"):
186 "Renvoie la mémoire totale utilisée en octets"
187 mem = self._VmB('VmSize:', unit)
188 self._max_mem = max(self._max_mem, mem)
191 def getUsedResident(self, unit="o"):
192 "Renvoie la mémoire résidente utilisée en octets"
193 mem = self._VmB('VmRSS:', unit)
194 self._max_rss = max(self._max_rss, mem)
197 def getUsedStacksize(self, unit="o"):
198 "Renvoie la taille du stack utilisé en octets"
199 mem = self._VmB('VmStk:', unit)
200 self._max_sta = max(self._max_sta, mem)
203 def getMaxUsedMemory(self):
204 "Renvoie la mémoire totale maximale mesurée"
207 def getMaxUsedResident(self):
208 "Renvoie la mémoire résidente maximale mesurée"
211 def getMaxUsedStacksize(self):
212 "Renvoie la mémoire du stack maximale mesurée"
215 # ==============================================================================
216 if __name__ == "__main__":
217 print '\n AUTODIAGNOSTIC \n'
222 print "Les caractéristiques détaillées des applications et outils sont :"
223 print " - Application.......:",p.getName()
224 print " - Version...........:",p.getVersion()
225 print " - Date Application..:",p.getDate()
226 print " - Python............:",p.getPythonVersion()
227 print " - Numpy.............:",p.getNumpyVersion()
228 print " - Scipy.............:",p.getScipyVersion()
232 print "Les chemins ajoutés au système pour des outils :"
233 for k,v in p.getpaths().items():
234 print " %12s : %s"%(k,os.path.basename(v))
238 print "La mémoire disponible est la suivante :"
239 print " - mémoire totale....: %4.1f Mo"%m.getAvailableMemory("Mo")
240 print " - mémoire physique..: %4.1f Mo"%m.getAvailablePhysicalMemory("Mo")
241 print " - mémoire swap......: %4.1f Mo"%m.getAvailableSwapMemory("Mo")
242 print " - utilisable........: %4.1f Mo"%m.getUsableMemory("Mo")
243 print "L'usage mémoire de cette exécution est le suivant :"
244 print " - mémoire totale....: %4.1f Mo"%m.getUsedMemory("Mo")
245 print " - mémoire résidente.: %4.1f Mo"%m.getUsedResident("Mo")
246 print " - taille de stack...: %4.1f Mo"%m.getUsedStacksize("Mo")
247 print "Création d'un objet range(1000000) et mesure mémoire"
249 print " - mémoire totale....: %4.1f Mo"%m.getUsedMemory("Mo")
250 print "Destruction de l'objet et mesure mémoire"
252 print " - mémoire totale....: %4.1f Mo"%m.getUsedMemory("Mo")
253 print "L'usage mémoire maximal de cette exécution est le suivant :"
254 print " - mémoire totale....: %4.1f Mo"%m.getMaxUsedMemory()
255 print " - mémoire résidente.: %4.1f Mo"%m.getMaxUsedResident()
256 print " - taille de stack...: %4.1f Mo"%m.getMaxUsedStacksize()