1 #-*-coding:iso-8859-1-*-
3 # Copyright (C) 2008-2010 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
22 Informations sur le code et la plateforme, et mise à jour des chemins
24 La classe "PlatformInfo" permet de récupérer les informations générales sur
25 le code et la plateforme sous forme de strings, ou d'afficher directement
26 les informations disponibles par les méthodes. L'impression directe d'un
27 objet de cette classe affiche les informations minimales. Par exemple :
29 print PlatformInfo().getVersion()
30 created = PlatformInfo().getDate()
32 La classe "PathManagement" permet de mettre à jour les chemins système pour
33 ajouter les outils numériques, matrices... On l'utilise en instanciant
34 simplement cette classe, sans meme récupérer d'objet :
37 __author__ = "Jean-Philippe ARGAUD - Mars 2008"
41 # ==============================================================================
44 Rassemblement des informations sur le code et la plateforme
47 "Retourne le nom de l'application"
52 "Retourne le numéro de la version"
54 return version.version
57 "Retourne la date de création de la version"
61 def getPythonVersion(self):
62 "Retourne la version de python utilisée"
64 return ".".join(map(str,sys.version_info[0:3]))
66 def getNumpyVersion(self):
67 "Retourne la version de numpy utilisée"
69 return numpy.version.version
71 def getScipyVersion(self):
72 "Retourne la version de scipy utilisée"
74 return scipy.version.version
76 def getCurrentMemorySize(self):
77 "Retourne la taille mémoire courante utilisée"
82 return "%s %s (%s)"%(version.name,version.version,version.date)
84 # ==============================================================================
87 Mise à jour du path système pour les répertoires d'outils
91 parent = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
93 self.__paths["daExternals"] = os.path.join(parent,"daExternals")
94 self.__paths["daMatrices"] = os.path.join(parent,"daMatrices")
95 self.__paths["daNumerics"] = os.path.join(parent,"daNumerics")
97 for v in self.__paths.values():
98 sys.path.insert(0, v )
100 # Conserve en unique exemplaire chaque chemin
101 sys.path = list(set(sys.path))
106 Renvoie le dictionnaire des chemins ajoutés
110 # ==============================================================================
113 Permet de récupérer les différentes tailles mémoires du process courant
116 # Le module resource renvoie 0 pour les tailles mémoire. On utilise donc
117 # plutôt : http://code.activestate.com/recipes/286222/ et les infos de
118 # http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/en-US/Reference_Guide/s2-proc-meminfo.html
120 _proc_status = '/proc/%d/status' % os.getpid()
121 _memo_status = '/proc/meminfo'
124 'ko': 1024.0, 'mo': 1024.0*1024.0,
125 'Ko': 1024.0, 'Mo': 1024.0*1024.0,
127 'kB': 1024.0, 'mB': 1024.0*1024.0,
128 'KB': 1024.0, 'MB': 1024.0*1024.0,
134 def _VmA(self, VmKey, unit):
136 t = open(self._memo_status)
140 return 0.0 # non-Linux?
141 i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...'
142 v = v[i:].split(None, 3) # whitespace
144 return 0.0 # invalid format?
145 # convert Vm value to bytes
146 mem = float(v[1]) * self._scale[v[2]]
147 return mem / self._scale[unit]
149 def getAvailablePhysicalMemory(self, unit="o"):
150 "Renvoie la mémoire physique utilisable en octets"
151 return self._VmA('MemTotal:', unit)
153 def getAvailableSwapMemory(self, unit="o"):
154 "Renvoie la mémoire swap utilisable en octets"
155 return self._VmA('SwapTotal:', unit)
157 def getAvailableMemory(self, unit="o"):
158 "Renvoie la mémoire totale (physique+swap) utilisable en octets"
159 return self._VmA('MemTotal:', unit) + self._VmA('SwapTotal:', unit)
161 def getUsableMemory(self, unit="o"):
162 """Renvoie la mémoire utilisable en octets
163 Rq : il n'est pas sûr que ce décompte soit juste...
165 return self._VmA('MemFree:', unit) + self._VmA('SwapFree:', unit) + \
166 self._VmA('Cached:', unit) + self._VmA('SwapCached:', unit)
168 def _VmB(self, VmKey, unit):
170 t = open(self._proc_status)
174 return 0.0 # non-Linux?
175 i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...'
176 v = v[i:].split(None, 3) # whitespace
178 return 0.0 # invalid format?
179 # convert Vm value to bytes
180 mem = float(v[1]) * self._scale[v[2]]
181 return mem / self._scale[unit]
183 def getUsedMemory(self, unit="o"):
184 "Renvoie la mémoire totale utilisée en octets"
185 mem = self._VmB('VmSize:', unit)
186 self._max_mem = max(self._max_mem, mem)
189 def getUsedResident(self, unit="o"):
190 "Renvoie la mémoire résidente utilisée en octets"
191 mem = self._VmB('VmRSS:', unit)
192 self._max_rss = max(self._max_rss, mem)
195 def getUsedStacksize(self, unit="o"):
196 "Renvoie la taille du stack utilisé en octets"
197 mem = self._VmB('VmStk:', unit)
198 self._max_sta = max(self._max_sta, mem)
201 def getMaxUsedMemory(self):
202 "Renvoie la mémoire totale maximale mesurée"
205 def getMaxUsedResident(self):
206 "Renvoie la mémoire résidente maximale mesurée"
209 def getMaxUsedStacksize(self):
210 "Renvoie la mémoire du stack maximale mesurée"
213 # ==============================================================================
214 if __name__ == "__main__":
215 print '\n AUTODIAGNOSTIC \n'
220 print "Les caractéristiques détaillées des applications et outils sont :"
221 print " - Application.......:",p.getName()
222 print " - Version...........:",p.getVersion()
223 print " - Date Application..:",p.getDate()
224 print " - Python............:",p.getPythonVersion()
225 print " - Numpy.............:",p.getNumpyVersion()
226 print " - Scipy.............:",p.getScipyVersion()
230 print "Les chemins ajoutés au système pour des outils :"
231 for k,v in p.getpaths().items():
232 print " %12s : %s"%(k,os.path.basename(v))
236 print "La mémoire disponible est la suivante :"
237 print " - mémoire totale....: %4.1f Mo"%m.getAvailableMemory("Mo")
238 print " - mémoire physique..: %4.1f Mo"%m.getAvailablePhysicalMemory("Mo")
239 print " - mémoire swap......: %4.1f Mo"%m.getAvailableSwapMemory("Mo")
240 print " - utilisable........: %4.1f Mo"%m.getUsableMemory("Mo")
241 print "L'usage mémoire de cette exécution est le suivant :"
242 print " - mémoire totale....: %4.1f Mo"%m.getUsedMemory("Mo")
243 print " - mémoire résidente.: %4.1f Mo"%m.getUsedResident("Mo")
244 print " - taille de stack...: %4.1f Mo"%m.getUsedStacksize("Mo")
245 print "Création d'un objet range(1000000) et mesure mémoire"
247 print " - mémoire totale....: %4.1f Mo"%m.getUsedMemory("Mo")
248 print "Destruction de l'objet et mesure mémoire"
250 print " - mémoire totale....: %4.1f Mo"%m.getUsedMemory("Mo")
251 print "L'usage mémoire maximal de cette exécution est le suivant :"
252 print " - mémoire totale....: %4.1f Mo"%m.getMaxUsedMemory()
253 print " - mémoire résidente.: %4.1f Mo"%m.getMaxUsedResident()
254 print " - taille de stack...: %4.1f Mo"%m.getMaxUsedStacksize()