利用Python如何实时检测自身内存占用


Posted in Python onMay 09, 2020

前言

最近在做文本统计,用 Python 实现,遇到了一个比较有意思的难题——如何保存统计结果。

直接写入内存实在是放不下,十几个小时后内存耗尽,程序被迫关闭。如果直接写入数据库吧,每次写入又太慢了,本来就十几个小时了,这样下去就要往星期上数了,也不是个办法。

解决方案

最后,我想到了一个两者兼顾的方案——用内存做缓冲,达到一定量之后一次性将当前所有数据合并到硬盘里。

但这样就有一个阈值,如何确定同步硬盘的时机,通常可以按照文件粒度进行处理,比如处理一个语料文件同步一次……但我的语料有大有小,大的有10GB,根本等不到那一刻内存就爆炸了,后来我想用统计数据量进行判断……可这又有点难以估计,小了吧频繁写入,缓存的意义就不大了,大了吧还没等到条目数量达到,内存就已经爆满。另外考虑到将来程序会运行在不同配置的设备上,让其他开发者根据自身情况计算这个阈值也有点太不友好,于是我想到了一个办法——不如让 Python 自己检测自己的内存占用,如果快满了(或者达到阈值),就同步写入硬盘一次。

对于其他开发者来说,自身设备的内存多大是很容易查看的,根据系统运行状况设置一个合理的阈值,相当方便。

要用 Python 监控自身内存占用,要使用 psutil 这个库来和系统进行交互,基本逻辑就是先拿到自己的 pid ,然后根据这个 pid 去跟系统获取进程信息。

def get_current_memory_gb() -> int:
# 获取当前进程内存占用。
pid = os.getpid()
p = psutil.Process(pid)
info = p.memory_full_info()
return info.uss / 1024. / 1024. / 1024.

比如我系统是 32GB 内存,那么我设置个 20GB 就相当安全,用 Python 进行统计语料,数据多到进程占用 20GB 内存了,就把当前的数据写入硬盘,同步统计数据,然后清空程序里的字典缓存释放内存。

python之psutil

psutil是个跨平台库,能够轻松实现获取系统运行的进程和系统利用率,包括CPU、内存、磁盘、网络等信息。

Linux系统下的安装

pip install psutil

总结

到此这篇关于利用Python如何实时检测自身内存占用的文章就介绍到这了,更多相关Python实时检测自身内存占用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现360的字符显示界面
Feb 21 Python
Python面向对象编程中的类和对象学习教程
Mar 30 Python
python实现感知器算法详解
Dec 19 Python
python实现输入数字的连续加减方法
Jun 22 Python
python使用opencv驱动摄像头的方法
Aug 03 Python
实例分析python3实现并发访问水平切分表
Sep 29 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
利用anaconda作为python的依赖库管理方法
Aug 13 Python
Django--权限Permissions的例子
Aug 28 Python
Python-jenkins 获取job构建信息方式
May 12 Python
Python魔术方法专题
Jun 19 Python
如何通过Python3和ssl实现加密通信功能
May 09 #Python
详解Django配置JWT认证方式
May 09 #Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 #Python
win10从零安装配置pytorch全过程图文详解
May 08 #Python
Python reduce函数作用及实例解析
May 08 #Python
Python使用sqlite3模块内置数据库
May 07 #Python
Python打印特殊符号及对应编码解析
May 07 #Python
You might like
图书管理程序(三)
2006/10/09 PHP
PHP日期时间函数的高级应用技巧
2009/05/16 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
js 浏览器事件介绍
2012/03/30 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
JavaScript中的getTime()方法使用详解
2015/06/10 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
python查找第k小元素代码分享
2013/12/18 Python
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
Python赋值语句后逗号的作用分析
2015/06/08 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
Python 用三行代码提取PDF表格数据
2019/10/13 Python
python 读取数据库并绘图的实例
2019/12/03 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
介绍一下OSI七层模型
2012/07/03 面试题
财务负责人任命书
2014/06/06 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL