利用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+django实现文件上传
Jan 17 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
Python实现感知机(PLA)算法
Dec 20 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
详解Python做一个名片管理系统
Mar 14 Python
Django中多种重定向方法使用详解
Jul 17 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
对python中assert、isinstance的用法详解
Nov 27 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
教你如何使用Python Tkinter库制作记事本
Jun 10 Python
实例详解Python的进程,线程和协程
Mar 13 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 session处理的定制
2009/03/16 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
下拉框select的绑定示例
2014/09/04 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
浅谈JS继承_借用构造函数 & 组合式继承
2016/08/16 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
js实现限定范围拖拽的示例
2020/10/26 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
使用Python实现一个简单的项目监控
2015/03/31 Python
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
python面试题之列表声明实例分析
2019/07/08 Python
Django更新models数据库结构步骤
2020/04/01 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
安全事故检讨书
2014/01/18 职场文书
军神教学反思
2014/02/04 职场文书
风险评估实施方案
2014/03/09 职场文书
仓库规划计划书
2014/04/28 职场文书
初级党校心得体会
2014/09/11 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
2015年教师节活动总结
2015/03/20 职场文书
Redis分布式锁Redlock的实现
2021/08/07 Redis