高性能なPCとか使っているとついつい富豪的なプログラミングでもいいかーとか怠けてしまうけれど
ラズベリーパイとかだとちょっとリソースが少なめなのでちょっとメモリは気をつけたい。
メモリ消費量をどうやって調べればいいのか、ぐぐってみたら面白そうなものを発見した。
↑ここに書いてあったのだが、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以上も消耗している。
これはファイルのすべての行をリストにして返す関数なので、すべてがメモリにロードされたのでこれほど消費された。
プログラムのどの場所で具体的にどれほど増加しているかが一目でわかるのはいいね。