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的內存容量,經過圖表咱們能夠直觀的看到內存的數據增加,而且可以有效的理解內存上的分配數據。
後續咱們就能夠經過代碼上的優化調整內存中的數據和性能。內存

相關文章
相關標籤/搜索