Я пишу сценарий Python, который загружает 4K видео и играет их по запросу. Когда моя память устройства выходит за предел 7,2 ГБ, она удаляет видео с наименьшим количеством количества представлений.
Используя бесплатную команду или вершину управляют, чтобы я мог получить информацию памяти. Но а именно, как я использовал общую память? Так, чтобы я мог возвратить это функции Python для сравнения порогу памяти.
Percentage использовал память (исключая буферы и кэш):
free | awk 'FNR == 3 {print $3/($3+$4)*100}'
Для Вашего вопроса Вы добавили: "выше 7,2 гигабайтов", но я предположил бы, что процент мог бы быть более гибким.
Чтобы подробно остановиться на этом, то же может использоваться для "свободной памяти процента":
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.
Можно также считать источник 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
переменная. С чем-то подобным для общей памяти можно вычесть значения (или сложить буферы, кэшируемые, и т.д.).
Вы могли также создать словарь значений в файле:
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
, например.
muru заинтриговал меня, чтобы использовать его в классе декоратора для измерения потребления памяти функцией.
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