Pythonスクリプトのメモリ消費量をしらべる

高性能なPCとか使っているとついつい富豪的なプログラミングでもいいかーとか怠けてしまうけれど
ラズベリーパイとかだとちょっとリソースが少なめなのでちょっとメモリは気をつけたい。

メモリ消費量をどうやって調べればいいのか、ぐぐってみたら面白そうなものを発見した。

Pythonスクリプトのパフォーマンス計測ガイド 

↑ここに書いてあったのだが、memory_profilerというものがあるらしい、
さっそくpipでDL

ちなみにリンク先で指定していたインストールする物は以下の通り。

$ pip install -U memory_profiler
$ pip install psutil

メモリ調査の方法

調査をしたい関数の上に、@profileってつけるだけ。
そして調査対象のスクリプトをこのように指定して実行するそうだ。
$ python -m memory_profiler hoge.py

さっそく僕が作ったサンプルプログラムを実行してみた。

Filename: smpl.py

Line #    Mem usage    Increment   Line Contents
================================================
    10    6.691 MiB    0.000 MiB   @profile
    11                             def readtxt2():
    12
    13    6.703 MiB    0.012 MiB       for s in open('/home/hogeuser/access_log','r'):
    14    6.703 MiB    0.000 MiB           pass

Filename: smpl.py

Line #    Mem usage    Increment   Line Contents
================================================
     3    6.672 MiB    0.000 MiB   @profile
     4                             def readtxt():
     5    6.672 MiB    0.000 MiB       f = open('/home/hogeuser/access_log','r')
     6    6.695 MiB    0.023 MiB       for s in f:
     7    6.695 MiB    0.000 MiB           pass

Filename: smpl.py

Line #    Mem usage    Increment   Line Contents
================================================
    16    6.699 MiB    0.000 MiB   @profile
    17                             def readtxt3():
    18    6.699 MiB    0.000 MiB       f = open('/home/hogeuser/access_log','r')
    19   68.504 MiB   61.805 MiB       lines =  f.readlines()
    20   68.504 MiB    0.000 MiB       for s in lines:
    21   68.504 MiB    0.000 MiB           pass
    22   68.500 MiB   -0.004 MiB       f.close()

一番左から、スクリプトの行番号
二番目が使用メモリ
三番目が増加分
四番目がソースの詳細

3つの関数を用意して、それぞれファイルを一行ずつ読み込むという想定。
ファイルはとっても行数が多い。
一番上と二番目の関数はファイルを読み込むときでも、forで回している時でもそれほどメモリは減っていない。
要請があったら随時ファイルに読みに行っているということだろう。

三番目の関数は、readlines()のところで60MB以上も消耗している。
これはファイルのすべての行をリストにして返す関数なので、すべてがメモリにロードされたのでこれほど消費された。

プログラムのどの場所で具体的にどれほど増加しているかが一目でわかるのはいいね。

スポンサードリンク

関連コンテンツ