利用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生成日历实例解析
Aug 21 Python
Python如何快速上手? 快速掌握一门新语言的方法
Nov 14 Python
python中学习K-Means和图片压缩
Nov 20 Python
Python实现常见的回文字符串算法
Nov 14 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
python三方库之requests的快速上手
Mar 04 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
Python适配器模式代码实现解析
Aug 02 Python
python爬虫 2019中国好声音评论爬取过程解析
Aug 26 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
Jun 12 Python
详解python with 上下文管理器
Sep 02 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
Jun 08 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实现分页的一个示例
2006/10/09 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
php中explode的负数limit用法分析
2015/02/27 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
jquery tools系列 expose 学习
2009/09/06 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
bootstrap是什么_动力节点Java学院整理
2017/07/14 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python datetime时间格式化去掉前导0
2014/07/31 Python
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
在notepad++中实现直接运行python代码
2019/12/18 Python
python中wx模块的具体使用方法
2020/05/15 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
IE9下html5初试小刀
2010/09/21 HTML / CSS
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
职工趣味运动会方案
2014/02/10 职场文书
四风问题查摆材料
2014/08/25 职场文书
活动总结范文
2014/08/30 职场文书
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android