getsizeof的局限

python非内置数据类型的对象无法用sys.getsizeof()获得真实的大小,例:

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

结果

  1. size of l: 87632
  2. size of graph: 64

分析

图graph中包含点序列l,而大小还不如l的大小,所以用getsizeof计算python的非内置类型的对象大小时是不准的。

使用psutil模块获取内存

例1:

  1. import networkx as nx
  2. import psutil
  3. import sys
  4. import os
  5. G = nx.Graph()
  6. l = [i for i in xrange(10000)]
  7. print "size of l:", sys.getsizeof(l)
  8. G.add_nodes_from(l)
  9. print "size of graph:", sys.getsizeof(G)
  10. process = psutil.Process(os.getpid())
  11. max_mem = process.memory_info().rss
  12. print 'max_mem:', max_mem

这样得到的有问题,需要把一开始系统所占的内存去掉

  1. import psutil
  2. import sys
  3. import os
  4.  
  5. process = psutil.Process(os.getpid())
  6.  
  7. max_mem_1 = process.memory_info().rss
  8. print 'max_mem:', max_mem_1
  9.  
  10. G = nx.Graph()
  11. l = [i for i in xrange(10000)]
  12. G.add_nodes_from(l)
  13.  
  14. max_mem_2 = process.memory_info().rss
  15. print 'max_2:', max_mem_2
  16. print 'max_mem:', max_mem_2 - max_mem_1

结果

  1. max_mem: 23724032
  2. max_2: 31637504
  3. max_mem: 7913472

例2:

  1. import psutil
  2. import os
  3. import sys
  4. from datetime import datetime
  5.  
  6. process = psutil.Process(os.getpid())
  7.  
  8. max_mem_1 = process.memory_info().rss / 1024.0 / 1024.0 / 1024.0
  9. print 'max_mem 1:', max_mem_1
  10.  
  11. all_road_nx = 'a' * 1024 * 1024 * 1024 * 10;
  12. print 'size:', sys.getsizeof(all_road_nx)/ 1024.0 / 1024.0 / 1024.0
  13. print 'len all_road_nx:', len(all_road_nx)
  14.  
  15. max_mem_2 = process.memory_info().rss / 1024.0 / 1024.0 / 1024.0
  16. print 'max_mem 2:', max_mem_2
  17.  
  18. print 'max_mem 3:', max_mem_2 - max_mem_1

结果:

  1. max_mem 1: 0.00862503051758
  2. size: 10.0000000345
  3. len all_road_nx: 10737418240
  4. max_mem 2: 10.0086517334
  5. 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获取系统状态举例

  1. #! coding:utf-8
  2. import networkx as nx
  3. import psutil
  4. import sys
  5. import os
  6.  
  7. p = psutil.Process(os.getpid())
  8.  
  9. psutil.pids() #查看系统全部进程
  10. p = psutil.Process(6241) #查看系统全部进程
  11. print "name:", p.name() #进程名
  12. print "bin 路径", p.exe() #进程的bin路径
  13. print "进程绝对路径", p.cwd() #进程的工作目录绝对路径
  14. print "进程状态", p.status() #进程状态
  15. print "进程创建时间", p.create_time() #进程创建时间
  16. print "进程uuid信息", p.uids() #进程uid信息
  17. print "进程gid信息", p.gids() #进程的gid信息
  18. print "进程的cpu时间信息", p.cpu_times() #进程的cpu时间信息,包括user,system两个cpu信息
  19. print "get进程cpu亲和度", p.cpu_affinity() #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好
  20. print "进程内存利用率", p.memory_percent() #进程内存利用率
  21. print "进程内存rss,vms信息", p.memory_info() #进程内存rss,vms信息
  22. print "进程的IO信息", p.io_counters() #进程的IO信息,包括读写IO数字及参数
  23. print "进程列表", p.connections() #返回进程列表
  24. print "进程开启的线程数", p.num_threads() #进程开启的线程数

结果

  1. name: python
  2. bin 路径 /home/tops/bin/python2.7
  3. 进程绝对路径 /home/jihite/iu_iso_test
  4. 进程状态 sleeping
  5. 进程创建时间 1463322002.74
  6. 进程uuid信息 puids(real=124674, effective=124674, saved=124674)
  7. 进程gid信息 pgids(real=100, effective=100, saved=100)
  8. 进程的cpu时间信息 pcputimes(user=14.38, system=2.38, children_user=0.0, children_system=0.0)
  9. 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]
  10. 进程内存利用率 0.0432284208934
  11. 进程内存rss,vms信息 pmem(rss=58548224, vms=534482944, shared=6922240, text=1536000, lib=0, data=268894208, dirty=0)
  12. 进程的IO信息 pio(read_count=4166, write_count=1192, read_bytes=0, write_bytes=0)
  13. 进程列表 [pconn(fd=3, family=2, type=1, laddr=('10.184.70.11', 57785), raddr=('10.184.70.13', 8018), status='ESTABLISHED')]
  14. 进程开启的线程数 4

python计算非内置数据类型占用内存的更多相关文章

  1. Python内置数据类型之Dictionary篇

    1.查看函数XXX的doc string. Python的函数是有属性的,doc string便是函数的属性.所以查看函数XXX的属性的方法是模块名.XXX.__doc__ 2.模块的属性 每个模块都 ...

  2. Python中内置数据类型list,tuple,dict,set的区别和用法

    Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...

  3. Python的四个内置数据类型list, tuple, dict, set

    Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, tuple, dict, set.这里对他们进行一个简明的总结. List ...

  4. Python笔记004-Python最基本内置数据类型和运算符

    第二章(1)Python编程基础概念 1. 最基本内置数据类型和运算符 每个对象都有类型,Python 中最基本的内置数据类型: 1. 整数 整数,2345 ,10 ,50 2. 浮点型 小数,3.1 ...

  5. Python内置数据类型总结

    python的核心数据类型:(很多语言之提供了数字,字符串,文件数据类型,其他形式的数据类型都以标准库的形式表示 也就是用之前需要import ) ,但是python有很多都是内置的,不需要impor ...

  6. Python作业---内置数据类型

    实验2 内置数据类型 实验性质:验证性 一.实验目的 1.掌握内置函数.列表.切片.元组的基本操作: 2.掌握字典.集合和列表表达式的基本操作. 二.实验预备知识 1.掌握Python内置函数的基/本 ...

  7. 笔记-pyton内置数据类型

    笔记-pyton内置数据类型 1.      简介 The principal built-in types are numerics, sequences, mappings, classes, i ...

  8. 二、JAVA基本数据类型:内置数据类型,引用类型

    变量的值存储在内存中,内存管理系统通过变量的类型分配存储空间,且该空间只能存储该类型数据,通过定义不同的变量,在内存中储存不同类型的数据. JAVA的两大数据类型 1. 内置数据类型 2.引用数据类型 ...

  9. Hive内置数据类型

    Hive的内置数据类型可以分为两大类:(1).基础数据类型:(2).复杂数据类型.其中,基础数据类型包括:TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBL ...

随机推荐

  1. Scrum会议8(Beta版本)

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  2. 在 MySQL 中查找含有目标字段的表

    要查询数据库中哪些表含有目标字段,可以使用语句: SELECT TABLE_SCHEMA,TABLE_NAME FROM information_schema.`COLUMNS` WHERE COLU ...

  3. 西川善司【神秘海域(Uncharted)】的图形分析

          本文是为传播0月8日发售的[神秘海域 合集]魅力而短篇连载的第2回,这次主要集中在神秘海域系列的图形的技术方面.原文链接在 http://weekly.ascii.jp/elem/000/ ...

  4. RT-Thread互斥锁

    互斥锁和信号量很相似, RT-Thread 中的互斥锁也有静态和动态之分,和互斥锁有关的操作如下:初始化—rt_mutex_init()(对应静态互斥锁):建立—rt_mutex_create()(对 ...

  5. RT-Thread 线程的让出

    前面两个例子演示的线程调度是由系统“主动干预”的情况的线程切换,其实我们也可以根据实际情况,采用主动让出 CPU 使用权.RT-Thread 中的系统函数: rt_thread_yield(),可以让 ...

  6. Java中共享设计

    Java中的共享设计的思路是在Java中形成一个对象池,在这个对象池中保存多个对象, 新实例化的对象如果已经在池中定义了,则不再重复新定义,而从池中直接取出继续使用. 例如,对于字符串来说,Java ...

  7. oracle communities

    应该常来这看看 https://www.oracle.com/communities/index.html

  8. 创建QT CREATOR对话框报错 linux QT Creator :-1: error: cannot find -lGL

    装完QT5.4 及 QT Creator3.3 后 创建第一个QT Widgets Application(相当于窗体) 应用程序 报如上错误. 执行 sudo apt-get install lib ...

  9. LMAO?

    70 weeks to finish TC problems? 2015.4.16 week1 week1~week8:Graph 1.DFS,BFS,Topological sort,Strongl ...

  10. Flume协作框架

    1.概述 ->flume的三大功能 collecting, aggregating, and moving 收集 聚合 移动 2.框图 3.架构特点 ->on streaming data ...