class Monitor: def __init__(self, pid: int | None = None): """ Parameters ---------- pid : int | None = None The process id to monitor, defaults to current process """ self.process = Process(pid) def memory(self, units: str = "B", *, kind: str = "vms") -> float: """Get the memory consumption Parameters ---------- units : "B" | "KB" | "MB" | "GB" = "B" Units to measure in kind : "vms" | "rss" = "vms" The kind of memory to measure. https://psutil.readthedocs.io/en/latest/#psutil.Process.memory_info Returns ------- float The memory used """ mem = self.process.memory_info() if not hasattr(mem, kind): raise ValueError(f"No memory kind {kind}, use one from {mem}") usage = getattr(mem, kind) return memconvert(usage, frm="B", to=units) def memlimit(self, units: str = "B") -> tuple[float, float] | None: """ We can't limit using resource.setrlimit as it seems that None of the RLIMIT_X's are available. This we debugged by using `import psutil; print(dir(psutil))` in which a MAC system did not have any `RLIMIT_X` attributes while a Linux system did. Parameters ---------- units : "B" | "KB" | "MB" | "GB" = "B" Units to measure in Returns ------- float | None The memory limit. Returns None if it can't be gotten """ if hasattr(psutil, "RLIMIT_AS"): limits = self.process.rlimit(psutil.RLIMIT_AS) if units != "B": limits = tuple( memconvert(x, frm="B", to=units) for x in limits) return limits else: return None