python 如何测量运行中的程序内存 -- Valgrind

介绍

一般咱们能够用python profiler去分析应用程序中哪一个模块被屡次调用和那个程序部分运行的速度较为缓慢,可是并不可以准确给出咱们应用程序在运行中在内存中占用的大小。python

好比说在金融数据中会操做大量的实际数据驻存到内存中,并对数据空间大小和性能可以有更好的优化,就须要考虑内存的测量,保证不会形成程序在运行中过载的压力引起程序上的异常。数据库

有些状况下在python中定义类class 会开辟更多的内存,尤为是建立更多的实例数据就会内存的大量占用。有些状况下须要在类中定义__slots__来封装属性,可是这样会破坏类中内置的__dict__.
对于大量的数据运算和分析,这时候对内存的分配就须要额外的关注和分析,可以获得程序在运行时的内存方面的统计可以更好的提高程序的性能。缓存

Valgrind

Valgrind 可以动态分析程序性能的工具,可以自动测量内存管理和线程中的Bug,给出更详细的测量工具。bash

  • 内存错误探测
  • 双线程错误探测
  • 缓存和分支结构分析器
  • 堆分析器
  • 程序调用结构缓存和分支结构分析器

简单介绍一下Valgrind,更详细的内容能够参考官网.工具


示例

如何用来分析python方面程序的性能呢?
好比在作大量数据运算和分析上,用pytables读取大量数据,pytables的数据存贮是采用HDF5存贮结构进行数据存贮,HDF5是支持大量数据读取和性能上有必定的提高相对于数据库系统,可是并不能是一个有效的数据库系统,这里不要误解,HDF5是对某些数据的高速读取和录入上有很好的性能,不是一个关系型数据库也不是NoSQL数据库。HDF5玩起来很是的不容易。这里采用了两个库numpy和 pytables,这里在HDF5建立50个array dataset,每一个array的长度为10000000。python的代码:性能

import tables
import numpy as np

h5file = tables.openFile('test4.h5', mode='w', title="Test Array")
array_len = 10000000

arrays = np.arange(50)

for x in arrays:
    x_a = np.zeros(array_len, dtype=float)
    h5file.createArray(h5file.root, "test" + str(x), x_a)

h5file.close()

如何分析性能

  1. massif
    massif 可以检测系统中的内存占用状况。咱们将上述的代码保持成test.py

valgrind --tool=massif python test.py优化

而后咱们就会生成一个massif.out.???中的内容,而后咱们能够用 ms_print 命令。线程

massif.out.12076 > profile.txtcode


MB 558.5^ #. .. . | #: :: : | #: :: : | @::#:: ::: :: @:: | @::#:: ::: :: @:: | ,. @.:#::. ::: ::.@:: | @: @::#::: ::: :::@:: | @: @::#::: ::: :::@:: | , @: @::#::: ::: :::@:: | @ @: @::#::: ::: :::@:: | @ @: @::#::: ::: :::@:: | @@ @: @::#::: ::: :::@:: | @@ @: @::#::: ::: :::@:: | @@ @: @::#::: ::: :::@:: | ::::@@ @: @::#::: ::: :::@:: | ::::@@ @: @::#::: ::: :::@:: | ,::::@@ @: @::#::: ::: :::@:: | @::::@@ @: @::#::: ::: :::@:: | @::::@@ @: @::#::: ::: :::@:: | ...,....@::::@@ @: @::#::: ::: :::@:. 0 +----------------------------------------------------------------------->Gi 0 7.121

程序在启动中大概占用了500m的内存容量,经过图表咱们能够直观的看到内存的数据增加,而且可以有效的理解内存上的分配数据。
后续咱们就能够经过代码上的优化调整内存中的数据和性能。内存

相关文章
相关标签/搜索