python 如何测量运行中的程序内存 — Valgrind
admin
2023-07-31 01:48:04
0

介绍

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

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

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

Valgrind

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

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

简单介绍一下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.txt


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

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

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...