Source code for banff._common.src.diagnostics.memory_usage
"""memory_usage: for measurement of memory usage.
Uses non-standard `psutil` package, self-disables if not available.
"""
from ..nls import _
from .gensys_diagnostics import (
GensysDiagnostics,
default_log_level,
)
# `psutil` is NOT standard, so it's implemented as optional
try:
import psutil
_dependency_missing=False
except ImportError:
_dependency_missing=True
[docs]
class MemoryUsage(GensysDiagnostics):
"""Measure changes in memory usage, optionally as a context manager."""
def __init__(self, name, logger=None, log_level=default_log_level):
super().__init__()
self._enabled = self._enabled_global
if self.is_disabled():
return
self.name = name
self.logger=logger
self.log_level = log_level
if _dependency_missing:
return
self.process = psutil.Process()
self.used_start = None
self.used_end = None
def __enter__(self):
if self.is_disabled():
return
self.start()
def __exit__(self, exc_type, exc_value, traceback):
if self.is_disabled():
return
self.stop()
if self.logger is not None:
self.logger.log(self.log_level, self.print_usage())
else:
print(self.print_usage()) # noqa: T201
[docs]
def start(self):
if self.is_disabled():
return
if _dependency_missing:
return
self.used_start = self.process.memory_info().vms
[docs]
def stop(self):
if self.is_disabled():
return
if _dependency_missing:
return
self.used_end = self.process.memory_info().vms
[docs]
def print_usage(self):
if self.is_disabled():
return None
if _dependency_missing:
return _("[MEMORY] disabled (dependency missing, run `pip install psutil`)")
u_start_kb = self.used_start/1000
u_start_gb = self.used_start/1.0e9
u_end_kb = self.used_end/1000
u_end_gb = self.used_end/1.0e9
# CONTEXT: [MEMORY] <name of memory measurement>
return _("[MEMORY] {} change {:.0f} kB ({:.2f} GB), before {:.0f} kB ({:.2f} GB), after {:.0f} kB ({:.2f} GB)").format(
(self.name + ":").ljust(18),
u_end_kb-u_start_kb, u_end_gb - u_start_gb,
u_start_kb, u_start_gb,
u_end_kb, u_end_gb,
)