web-dev-qa-db-ja.com

Linuxで使用可能なメモリを確認する

4K ビデオをダウンロードし、要求に応じて再生するPythonスクリプトを作成しています。デバイスのメモリが7.2GBを超えると、再生回数が最も少ないビデオが削除されます。

freeコマンドまたはtopコマンドを使用して、メモリ情報を取得できます。しかし、具体的には、総メモリ使用量を取得するにはどうすればよいですか?これをPython関数に返して、メモリのしきい値と比較できるようにします。

7
ron123456

使用メモリの割合(バッファとキャッシュを除く):

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。

10
Rinzwind

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を使用して値を取得します。

16
muru