检查 Linux 中的可用内存

检查 Linux 中的可用内存

我正在编写一个 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

答案4

free --mega | awk 'FNR == 2 {print $7}'终端返回 Mega 中的可用内存。可以从 python 中调用它。

截屏

这适用于免费版本:procps-ng 3.3.17 的 mfree

相关内容