| #!/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"] | |
| ) | |
| ) |