4K ビデオをダウンロードし、要求に応じて再生するPythonスクリプトを作成しています。デバイスのメモリが7.2GBを超えると、再生回数が最も少ないビデオが削除されます。
freeコマンドまたはtopコマンドを使用して、メモリ情報を取得できます。しかし、具体的には、総メモリ使用量を取得するにはどうすればよいですか?これをPython関数に返して、メモリのしきい値と比較できるようにします。
使用メモリの割合(バッファとキャッシュを除く):
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
変数で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
を使用して値を取得します。