対応バージョン
Python3.4以上
Pythonでメモリ使用量を追跡したかった
それなりに重いデータをいじろうとすると、メモリの使用量が気になる事が多々あります。
秒単位で計測することはLinuxコマンドで比較的簡単に出来ますが、具体的にどの処理の後にメモリの使用量が増えているかを知りたく、Pythonの関数化してみました。
標準モジュールでのメモリ追跡の方法
tracemalloc という標準モジュール(Python3.4で追加)を使用します。
「Python が割り当てたメモリブロックをトレースするためのデバッグツール」が目的のモジュールらしいです。
書いてる途中で気が付いたのですが、公式ドキュメントのサンプルが充実しすぎてたのでそちらを見ましょう…
合計値のみ簡易的に出したい!!って方は以下のコードが参考になるとは思います。多分。
融通が利かない部分はあるらしいですが、追加でライブラリをインストールする必要がなくそれなりの情報が手軽に利用できます。
以下のような感じのコードでメモリ使用量が表れてくれます。
メモリを計測する際は「tracemalloc.start()」を実行してから実処理を回すようにしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import tracemalloc def format_bytes(size): power = 2 ** 10 # 2**10 = 1024 n = 0 power_labels = ['B', 'KB', 'MB', 'GB', 'TB'] while size > power and n <= len(power_labels): size /= power n += 1 return 'current used memory: {:.3f} {}'.format(size, power_labels[n]) def log_memory(): snapshot = tracemalloc.take_snapshot() size = sum([stat.size for stat in snapshot.statistics('filename')]) print(format_bytes(size)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
tracemalloc.start() print('-- start --') log_memory() import pandas as pd print('-- after import --') log_memory() df = pd.read_csv('mydata.csv') print('-- after read csv --') col = df['column_1'] i = 0 for value in col: # DO SOMETHING i += 1 if i % 100 == 0: print('-- while process --') print(i) log_memory() |
出力結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-- start -- current used memory: 0.000 B -- after import -- current used memory: 2.094 MB -- after read csv -- current used memory: 5.584 GB -- while process -- 100 current used memory: 5.619 GB -- while process -- 200 current used memory: 5.627 GB -- while process -- 300 current used memory: 5.627 GB -- while process -- 400 current used memory: 5.628 GB |
やっぱDataFrameすげえ重いですね。でも便利だからね、仕方ないね。上手く付き合わねば。