利用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 str与repr的区别
Mar 23 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
pandas将DataFrame的列变成行索引的方法
Apr 10 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
python脚本后台执行方式
Dec 21 Python
python对接ihuyi实现短信验证码发送
May 10 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
Feb 25 Python
python代码实现扫码关注公众号登录的实战
Nov 01 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
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
PDO::errorCode讲解
2019/01/28 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
短信提示使用 特效
2007/01/19 Javascript
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
jquery判断元素的子元素是否存在的示例代码
2014/02/04 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
smartupload实现文件上传时获取表单数据(推荐)
2016/12/12 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
Python实现二分查找与bisect模块详解
2017/01/13 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
css 省略号 css3让多余的字符串消失并附加省略号的实现代码
2013/02/07 HTML / CSS
美国电子产品折扣网站:Daily Steals
2017/05/20 全球购物
为什么要用EJB
2014/04/17 面试题
会议开场欢迎词
2014/01/15 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
工程款申请报告
2015/05/15 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
中秋节随笔
2015/08/15 职场文书