【发布时间】:2017-02-09 09:55:44
【问题描述】:
这是测量自进程启动以来当前进程的峰值内存使用量的方法。
process= psutil.Process(os.getpid())
process.memory_full_info().peak_wset
但是,如果我想对程序的不同部分(功能)进行少量测量怎么办?如何在任何需要的时刻获得程序使用的内存来检查前后的差异? 或许有办法重置peak_wset?
【问题讨论】:
这是测量自进程启动以来当前进程的峰值内存使用量的方法。
process= psutil.Process(os.getpid())
process.memory_full_info().peak_wset
但是,如果我想对程序的不同部分(功能)进行少量测量怎么办?如何在任何需要的时刻获得程序使用的内存来检查前后的差异? 或许有办法重置peak_wset?
【问题讨论】:
目前您在检查当前进程时不再需要os.getpid()。只需使用psutil.Process()
1) 要在函数调用之前测量峰值内存是否增加(从未减少),请在函数调用之前和之后调用此函数并获取差异:
psutil.Process().memory_info().peak_wsetpsutil.Process().memory_full_info().peak_wsetresource.getrusage(resource.RUSAGE_SELF).ru_maxrss 可以解决问题,但我还没有测试过。2) 要测量函数调用前后的当前内存变化,请在函数调用前后调用它并取差值:
psutil.Process().memory_info().rsspsutil.Process().memory_full_info().rsspsutil.Process().memory_full_info().uss来自docs:
memory_full_info()返回与memory_info()相同的信息,此外,在某些平台(Linux、macOS、Windows)上,还提供其他指标(USS、PSS和交换)。附加指标更好地表示“有效”进程内存消耗(在 USS 的情况下),如本博文中详细解释的那样。它通过传递整个进程地址来实现。因此,它通常需要比memory_info()更高的用户权限,而且速度要慢得多。在未实现额外字段的平台上,这只会返回与memory_info()相同的指标。
uss(Linux、macOS、Windows):又名“唯一集大小”,这是一个进程独有的内存,如果该进程现在被终止,它将被释放.注意:
uss可能是确定进程实际使用了多少内存的最具代表性的指标。
3) 要测量函数调用在执行期间使用的特定内存,在进行任何垃圾回收之前,您需要一个memory profiler。
【讨论】: