python計算非內置數據類型占用內存


getsizeof的局限

python非內置數據類型的對象無法用sys.getsizeof()獲得真實的大小,例:

import networkx as nx
import sys
G = nx.Graph()
l = [i for i in xrange(10000)]
print "size of l:", sys.getsizeof(l)
G.add_nodes_from(l)
print "size of graph:", sys.getsizeof(G)

結果

size of l: 87632
size of graph: 64

分析

圖graph中包含點序列l,而大小還不如l的大小,所以用getsizeof計算python的非內置類型的對象大小時是不准的。

使用psutil模塊獲取內存

例1:

import networkx as nx
import psutil
import sys
import os
G = nx.Graph()
l = [i for i in xrange(10000)]
print "size of l:", sys.getsizeof(l)
G.add_nodes_from(l)
print "size of graph:", sys.getsizeof(G)
process = psutil.Process(os.getpid())
max_mem = process.memory_info().rss
print 'max_mem:', max_mem

這樣得到的有問題,需要把一開始系統所占的內存去掉

import psutil
import sys
import os

process = psutil.Process(os.getpid())

max_mem_1 = process.memory_info().rss
print 'max_mem:', max_mem_1

G = nx.Graph()
l = [i for i in xrange(10000)]
G.add_nodes_from(l)

max_mem_2 = process.memory_info().rss
print 'max_2:', max_mem_2
print 'max_mem:', max_mem_2 - max_mem_1

結果

max_mem: 23724032
max_2: 31637504
max_mem: 7913472

例2:

import psutil
import os
import sys
from datetime import datetime

process = psutil.Process(os.getpid())

max_mem_1 = process.memory_info().rss / 1024.0 / 1024.0 / 1024.0
print 'max_mem 1:', max_mem_1

all_road_nx = 'a' * 1024 * 1024 * 1024 * 10;
print 'size:', sys.getsizeof(all_road_nx)/ 1024.0 / 1024.0 / 1024.0
print 'len all_road_nx:', len(all_road_nx)


max_mem_2 = process.memory_info().rss / 1024.0 / 1024.0 / 1024.0
print 'max_mem 2:', max_mem_2

print 'max_mem 3:', max_mem_2 - max_mem_1

結果:

max_mem 1: 0.00862503051758
size: 10.0000000345
len all_road_nx: 10737418240
max_mem 2: 10.0086517334
max_mem 3: 10.0000267029

python模塊psutil簡介

psutil提供了個接口,可以用來獲取信息,包括:

  • 當前運行的進程
  • 系統(資源使用)信息
  • CPU
  • 內存
  • 磁盤
  • 網絡
  • 用戶

psutil實現了很多功能,包括了如下工具所具有的:

  • ps
  • top
  • df
  • kill
  • free
  • lsof
  • free
  • netstat
  • ifconfig
  • nice
  • ionice
  • iostat
  • iotop
  • uptime
  • pidof
  • tty
  • who
  • taskset
  • pmap

psutil獲取系統狀態舉例

#! coding:utf-8
import networkx as nx
import psutil
import sys
import os

p = psutil.Process(os.getpid())

psutil.pids()  #查看系統全部進程
p = psutil.Process(6241)  #查看系統全部進程
print "name:", p.name()   #進程名
print "bin 路徑", p.exe()    #進程的bin路徑
print "進程絕對路徑", p.cwd()    #進程的工作目錄絕對路徑
print "進程狀態", p.status()   #進程狀態
print "進程創建時間", p.create_time()  #進程創建時間
print "進程uuid信息", p.uids()    #進程uid信息
print "進程gid信息", p.gids()    #進程的gid信息
print "進程的cpu時間信息", p.cpu_times()   #進程的cpu時間信息,包括user,system兩個cpu信息
print "get進程cpu親和度", p.cpu_affinity()  #get進程cpu親和度,如果要設置cpu親和度,將cpu號作為參考就好
print "進程內存利用率", p.memory_percent()  #進程內存利用率
print "進程內存rss,vms信息", p.memory_info()    #進程內存rss,vms信息
print "進程的IO信息", p.io_counters()    #進程的IO信息,包括讀寫IO數字及參數
print "進程列表", p.connections()   #返回進程列表
print "進程開啟的線程數", p.num_threads()  #進程開啟的線程數

結果

name: python
bin 路徑 /home/tops/bin/python2.7
進程絕對路徑 /home/jihite/iu_iso_test
進程狀態 sleeping
進程創建時間 1463322002.74
進程uuid信息 puids(real=124674, effective=124674, saved=124674)
進程gid信息 pgids(real=100, effective=100, saved=100)
進程的cpu時間信息 pcputimes(user=14.38, system=2.38, children_user=0.0, children_system=0.0)
get進程cpu親和度 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]
進程內存利用率 0.0432284208934
進程內存rss,vms信息 pmem(rss=58548224, vms=534482944, shared=6922240, text=1536000, lib=0, data=268894208, dirty=0)
進程的IO信息 pio(read_count=4166, write_count=1192, read_bytes=0, write_bytes=0)
進程列表 [pconn(fd=3, family=2, type=1, laddr=('10.184.70.11', 57785), raddr=('10.184.70.13', 8018), status='ESTABLISHED')]
進程開啟的線程數 4

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM