我正在编写一个 Python 脚本来下载4K视频并按要求播放。当我的设备内存超过 7.2 GB 时,它会删除观看次数最少的视频。
使用自由的命令或顶部命令我可以获得内存信息。但具体来说,我如何获得已使用的总内存?这样我就可以将其返回给 Python 函数来与内存阈值进行比较。
答案1
free
您还可以阅读的信息来源/proc/meminfo
:
~ head /proc/meminfo
MemTotal: 4039168 kB
MemFree: 2567392 kB
MemAvailable: 3169436 kB
Buffers: 81756 kB
Cached: 712808 kB
SwapCached: 0 kB
Active: 835276 kB
Inactive: 457436 kB
Active(anon): 499080 kB
Inactive(anon): 17968 kB
在Python, 例如:
with open('/proc/meminfo') as file:
for line in file:
if 'MemFree' in line:
free_mem_in_kb = line.split()[1]
break
将获取free_mem_in_kb
变量中的可用内存(单位为 KB)。对于总内存,您可以减去这些值(或添加缓冲区、缓存等)。
您还可以创建文件中的值的字典:
from collections import namedtuple
MemInfoEntry = namedtuple('MemInfoEntry', ['value', 'unit'])
meminfo = {}
with open('/proc/meminfo') as file:
for line in file:
key, value, *unit = line.strip().split()
meminfo[key.rstrip(':')] = MemInfoEntry(value, unit)
然后使用 检索值meminfo['MemAvailable'].value
,例如。
答案2
已使用内存的百分比(不包括缓冲区和缓存):
free | awk 'FNR == 3 {print $3/($3+$4)*100}'
对于您的问题,您添加了:“7.2 GB 以上”,但我认为百分比可能更灵活。
进一步来说,同样可以用于“可用内存百分比”:
free | awk 'FNR == 3 {print $4/($3+$4)*100}'
awk
是图案扫描工具带有大量参数。FNR 是当前输入文件中的输入记录编号。基本上是当前处理的行。因此 FNR 将扫描第 3 行,其中的数字是您想要的。$3 和 $4 指向第 3 列和第 4 列。如果您想要数字本身,请使用:
free | awk 'FNR == 3 {print $3}'
free | awk 'FNR == 3 {print $4}'
例子:
$ free
total used free shared buffers cached
Mem: 16419996 16144316 275680 0 447220 12589412
-/+ buffers/cache: 3107684 13312312
Swap: 16761852 38532 16723320
~$ free | awk 'FNR == 3 {print $3}'
3109056
~$ free | awk 'FNR == 3 {print $4}'
13311240
如果您需要缓冲区和缓存:FNR=2。如果您需要交换,FNR=4。
答案3
muru 的 Python 代码引起了我的兴趣,我在装饰器类中使用它来测量函数的内存消耗。
class memoryit:
def FreeMemory():
with open('/proc/meminfo') as file:
for line in file:
if 'MemFree' in line:
free_memKB = line.split()[1]
return (float(free_memKB)/(1024*1024)) # returns GBytes float
def __init__(self, function): # Decorator class to print the memory consumption of a
self.function = function # function/method after calling it a number of iterations
def __call__(self, *args, iterations = 1, **kwargs):
before = memoryit.FreeMemory()
for i in range (iterations):
result = self.function(*args, **kwargs)
after = memoryit.FreeMemory()
print ('%r memory used: %2.3f GB' % (self.function.__name__, (before - after) / iterations))
return result
测量消耗的功能:
@memoryit
def MakeMatrix (dim):
matrix = []
for i in range (dim):
matrix.append([j for j in range (dim)])
return (matrix)
用法:
print ("Starting memory:", memoryit.FreeMemory())
m = MakeMatrix(10000)
print ("Ending memory:", memoryit.FreeMemory() )
打印出:
Starting memory: 10.58599853515625
'MakeMatrix' memory used: 3.741 GB
Ending memory: 6.864116668701172