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