如何使用Python动态控制Linux系统的内存占用百分比

如何使用Python动态控制Linux系统的内存占用百分比,第1张

如何使用Python动态控制Linux系统的内存占用百分比

近期有网上朋友寻求帮助:如何通过脚本动态控制Linux系统的内存占用百分比?经过一番百度+编写调试,终于初步完成了动态控制Linux系统内存占用百分比。现写出来以帮助更多的朋友。

1 前言

根据需求是动态控制Linux系统内存占用百分比,比如当前内存占用30%,如果设置内存占用为70%,则需要申请内存使达到占用70%;如果再降低到40%,则需要释放部分申请的内存。其实脚本的本质是内存动态申请与释放。

注意:因为Python脚本运行之前内存有一定占用,故设定内存占用不能低于该百分比。

2 内存动态申请

通过查询资料,使用Python动态申请内存块,可以使用ctypes包中的函数,导入包及代码如下所示

>>> from ctypes import

>>> mem=create_string_buffer(1024)

说明:内存申请使用create_string_buffer()函数,上面申请了1024字节的内存块。

下面演示申请100MB内存前后变化

申请前如下图所示:

使用代码如下:

>>>mem=create_string_buffer(104857600)

申请后如下图所示:

从上述两幅图中可以看出,申请内存前内存占用295MB,申请后内存占用397MB,增加了约100MB内存占用。

3 内存动态释放

由于Python对内存是有垃圾回收机制的,采用对象引用计数方式。当对象的引用计数为0时,启动垃圾回收GC。此处内存动态释放就是使用该原理。

代码如下:

>>> mem=None

释放后内存占用如下图所示:

内存占用由397MB降低到297MB,释放了100MB内存占用。

说明:将None赋值给对象mem后,mem对象的引用计数即为0,此时垃圾回收启动,释放mem对象占用的内存。

4 系统总内存、占用内存检测

由于需要设定内存占用百分比,故需要获取系统总物理内存和占用内存。本文使用的方法是读取系统文件“/proc/meminfo”,从中解析出总内存大小以及当前内存占用大小等内存相关的信息。该文件内容格式如下图所示:

代码片段如下所示:

f = open("/proc/meminfo")

lines = freadlines()

fclose()

for line in lines:

if len(line)< 2:continue

name = linesplit(':')[0]

var = linesplit(':')[1]split()[0]

mem[name]= long(var) 10240

mem['MemUsed']= mem['MemTotal']- mem['MemFree']

说明:按行读取meminfo文件内容,创建字典对象mem,将meminfo文件第一列设置为mem对象的键值,将meminfo文件第二列数字设置为mem对象的值。

5 获取用户输入百分比

通过读取键盘输入字符串,然后转换为数字实现接收用户输入的百分比,代码如下所示:

input_str=raw_input("Input UsedMemory`s Rate or q to exit:")

rate=float(input_str)

注意:此处键盘输入的都是字符串,需要进行字符串转换为数字,使用float()或long()函数进行转换。

6 动态设置内存占用百分比测试

测试使用两个Python脚本文件,分别是testpy和mem_ratepy,其功能分别是查看当前内存占用和动态设定内存占用百分比。如下图所示:

注意:上述两个文件需要使用“chmod +x py”修改为可执行属性。

61 查看当前内存占用

查看当前内存占用百分比,使用上述testpy文件,运行命令为“/testpy”,运行结果如下图所示:

当前使用内存为320MB,占用百分比为17%。

62 动态设置内存占用百分比

动态设置内存占用百分比使用上述mem_ratepy脚本,注意该脚本文件第一行代码为“#!/usr/bin/python26”,表示该脚本使用python26程序运行。该行需要修改为待运行Linux系统中Python实际的安装程序路径。

动态内存百分比设置界面如下图所示:

处于待输入状态。另外显示了当前内存占用(321MB),总内存大小(1869MB)以及内存占用百分比(17%)。

如果此时设置内存占用百分比为80%,则脚本会每次申请10MB空间,直至内存占用接近或等于80%为止。如下图所示:

内存申请过程如下图所示:

内存申请过程中占用百分比变化为:35%,45%,56%,70%,…

mem_ratepy运行过程如下图所示:

内存申请过程中占用变化为:1461MB,1471MB,1481MB,1491MB。

此时如果内存占用百分比设置为20%,则需要释放一部分内存。

testpy脚本运行过程如下图所示:

由于释放内存运行较快,抓取到最后结果

内存占用为20%。

mem_ratepy脚本运行过程如下图所示:

内存释放过程中内存占用为:413MB,403MB,393MB,383MB,最后内存占用稳定在20%,383MB。

输入“q”或“Q”退出内存占用百分比设定过程,如下图所示:

此时内存占用如下图所示:

内存占用恢复到运行mem_ratepy脚本之前状态,17%,321MB。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

附:完整Python脚本代码

testpy

------------------------------------------------------------------------------------------------

#!/usr/bin/python26

def memory_stat():

mem = {}

f = open("/proc/meminfo")

lines = freadlines()

fclose()

for line in lines:

if len(line)< 2:continue

name = linesplit(':')[0]

var = linesplit(':')[1]split()[0]

mem[name]= long(var) 10240

mem['MemUsed']= mem['MemTotal']- mem['MemFree']

# - mem['Buffers']- mem['Cached']

return mem

mem=memory_stat()

print("Used(MB):%d"%(long(mem['MemUsed'])/1024/1024))

print("Rate:%d%%"%(100long(mem['MemUsed'])/float(mem['MemTotal'])))

§§§§§§§§§§§§§§§§§§§§§§§§§§

mem_ratepy

---------------------------------------------------

#!/usr/bin/python26

from ctypes import

# Get Memory Info(Total, Used Byte)

def get_memory_stat():

mem = {}

f = open("/proc/meminfo")

lines = freadlines()

fclose()

for line in lines:

if len(line)< 2:continue

name = linesplit(':')[0]

var = linesplit(':')[1]split()[0]

mem[name]= long(var) 10240

mem['MemUsed']= mem['MemTotal']- mem['MemFree']

# Return MemroyInfo Object

return mem

# Get Simple Memory Info

def get_memory_info(mem):

# Byte -> MB

n=1024 1024

used=float(mem['MemUsed'])/ n

total=float(mem['MemTotal'])/ n

rate=used/total 100

smp={'used':used,'total':total,'rate':rate}

return smp

# Display Current Memory Info

def print_memory_info(mem):

# Get SimpleMemory Info

smp=get_memory_info(mem)

print("Used(MB):%d\tTotal(MB):%d\tUsedRate:%d%%"%(smp['used'], smp['total'], smp['rate']))

# Get Rate Of Memory Used To Be Setted(Integer Formate)

def input_memory_used_rate(org_rate):

# Byte -> MB

n=1024 1024

while(True):

mem=get_memory_stat()

print_memory_info(mem)

input_str=raw_input("Input UsedMemory`s Rate or q to exit:")

if(len(input_str)== 0):

continue

if("q"== input_str):

info={'rate':0,'used':mem['MemUsed']/ n}

return info

if("Q"== input_str):

info={'rate':0,'used':mem['MemUsed']/ n}

return info

try:

rate=float(input_str)

if((rate>=org_rate)and (rate<=95)):

info={'rate':rate,'used':mem['MemUsed']/ n}

return info

else:

print("Please inputa valid number(%d%%~95%%)"%(org_rate))

except:

print("Please inputa valid number(%d%%~95%%)"%(org_rate))

# Set Rate Of Memory Used

def set_memory_used_rate(new_rate, total, pre_used,list):

if(new_rate==0):

return None

dest_mem=total new_rate /1000

# 10MB

mb10=10485760

n_chg=10

# Free Memory OrAllocate Memory

is_new=dest_mem>pre_used

cur_used=pre_used

while(True):

# To Calc FreeMemory Or Allocate Memory

need_new=dest_mem-n_chg>=pre_used

need_del=dest_mem+n_chg<=pre_used

# Need To AllocateMemory

if(is_new):

if(need_new):

p=create_string_buffer(mb10)

listappend(p)

dest_mem=dest_mem-n_chg

cur_used=cur_used+n_chg

else:

return"end"

# Need To FreeMemory

else:

idx=len(list)-1

if(need_deland (idx>=0)):

p=list[idx]

del list[idx]

p=None

dest_mem=dest_mem+n_chg

cur_used=cur_used-n_chg

else:

return"end"

print(" MemoryUsed(MB):%d"%(cur_used))

# Entry Of Program

# List Of Memory Object, 10MB Of One Object

list=[]

# Get Current Memory Info

mem=get_memory_stat()

# Get Simple Memory Info

smp=get_memory_info(mem)

org_rate=smp['rate']

total=smp['total']

while(True):

# Get Rate OfMemory To Be Used

info=input_memory_used_rate(org_rate)

new_rate=float(info['rate'])

pre_used=float(info['used'])

# Set Rate OfMemory To Be Used

rtn=set_memory_used_rate(new_rate, total, pre_used, list)

if(not rtn):

print("bye!")

exit()

1

2

s = 'abc'

print sysgetsizeof(s)

如果你要监测所有的变量,可以用python的smiley 模块监测所有的内存变量情况

最大能用多大内存是 *** 作系统的限制,跟python没有直接关系,因为python是没有限制的。

ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是其非开放造成的。Guido 决心在Python 中避免这一错误。同时,他还想实现在ABC 中闪现过但未曾实现的东西。

扩展资料:

一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{}来明确的定出模块的边界的,与字符的位置毫无关系)。这一点曾经引起过争议。

因为自从C这类的语言诞生后,语言的语法含义与字符的排列方式分离开来,曾经被认为是一种程序语言的进步。不过不可否认的是,通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。

参考资料来源:百度百科-Python

python 怎么在循环中释放内存 #include"stdioh" main() { char st[15]; printf("input string:\n"); gets(st); puts(st); }

pip install memory_profiler

pip install psutil

pip install matplotlib

使用方法

from memory_profiler import profile

@profile(precision=4, stream=open('testlog', 'w+'))

def test(args: List):

运行:

python3 testpy

Mem usage:表示执行该行后Python解释器的内存使用情况

Increment:表示当前行的内存相对于上一行的差异,即自己本身增长了多少,如果减少了则不显示

以上就是关于如何使用Python动态控制Linux系统的内存占用百分比全部的内容,包括:如何使用Python动态控制Linux系统的内存占用百分比、请教各位牛人,python中有没有计算某个对象占用内存大小的函数、python 最大能用多大内存等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10133915.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存