blob: 14d31a8d8fb7e1ed9568e0e059d076a492e815dd [file] [log] [blame] [edit]
#!/usr/bin/env python3
"""
Utilities related to performance measurement.
"""
import time
# =============================================================================
def get_memory_usage():
"""
Returns memory usage of the current process in GB.
WORKS ONLY ON A LINUX SYSTEM.
"""
status = None
result = {'peak': 0.0, 'rss': 0.0}
try:
# This will only work on systems with a /proc file system
# (like Linux).
status = open('/proc/self/status')
for line in status:
parts = line.split()
key = parts[0][2:-1].lower()
if key in result:
result[key] = int(parts[1]) / (1024 * 1024)
finally:
if status is not None:
status.close()
return result
# =============================================================================
class MemoryLog(object):
"""
Memory usage logging helper class.
Create object of the MemoryLog type, provide it with the log file name.
Then at each important point of the script call its "checkpoint" method.
"""
def __init__(self, file_name):
self.fp = open(file_name, "w")
self.t0 = time.time()
self._write("Time [s], Label, Peak [GB], RSS [GB]\n")
def _write(self, s):
self.fp.write(s)
self.fp.flush()
def checkpoint(self, label):
mem = get_memory_usage()
self._write(
"{:.1f}, {}, {:.2f}, {:.2f}\n".format(
time.time() - self.t0, label, mem["peak"], mem["rss"]
)
)