注目キーワード

【Python】プログラムのメモリ使用量を確認する

Pythonプログラムを実行している間、作成した変数などはPCのメモリ上に保存されています。そのため大規模なデータを扱うとき、メモリ使用量が気になる場合があります。

例えばPCのメインメモリが8GBの場合、OSやブラウザ・エディタなどもメモリを利用しているため、8GB分全てをPythonが利用することはできません。こちらの記事ではPythonでメモリ使用量を確認する方法について手法を確認し、比較してみます。

ライブラリのインストール

こちらの記事ではメモリ関係の情報を扱うために、psutilmemory_profiler という2つのライブラリを利用します。両方のライブラリはpipを使ってインストールできます。インストールする際には pip install psutil と  pip install memory_profiler  を実行します。

psutilとmemory_profilerを利用した簡易的なメモリ使用量の把握

まずはpsutilとmemory_profilerを利用した簡易的なメモリ使用量の確認方法を説明します。これらのライブラリを利用することで、現在のPCのメモリ状態を取得することができます。

まずは端末から psutil を利用してみます。ライブラリをインポートし、virtual_memory() を呼び出します。

psutil.virtual_memory()を実行した様子

この端末はMacを利用していたので、Macのアクティビティモニタを利用してPCのメモリ状況を確認してみました。必ずしも数値が完全に一致するわけではないことに注意してください。使用済みメモリ6.69GBに対して物理メモリが8.00GBなので、6.69/8.00=0.83となり、実際は83%のメモリを利用しています。Pythonからメモリ情報を見たときは、75.6%利用済みとなるので、そこそこの情報が取れていることが分かります。

Macのアクティビティモニタで確認した結果

psutilをプログラムから利用するとき、取得した情報から例えば usedfree の分を確認することで簡易的にメモリ情報を利用することができます。

psutilを用いるサンプルソース

サンプルの実装です。間でそこそこの大きさの配列を作ってメモリを消費させ、差分を確認しています。

実行結果

実行結果です。引き算した結果が出力されました。b1とb2自体もprintしているので、中身を確認してみて下さい。

psutilを処理の前後で呼び出し、差分を計算した図

memory_profilerを用いるサンプルソース

次にmemory_profilerを利用してみます。memory_profilerの memory_usage() を使うと、特定のプロセスの使用メモリ量を監視することができます。サンプルの実装では、上の実装と同様に中間でメモリを浪費させ、前後で観測したメモリ使用量の差分を観測しています。最後のコメントアウトしてある行は、プログラムを終了させず停止させるために利用します。

実行結果

実行結果です。1099(単位はMB)の表示がされました。2つの実行結果で表示される数値が結構異なることが分かるかと思います。私は個人的にはmemory_profilerの方の数値を信頼して使っていました。

memory_profilerによる確認結果

実際、上でコメントアウトした行を追加し、pythonのプロセスをMacのアクティビティモニタから確認した結果は次のようになります。Macから見たメモリ消費量は975MBとのことで、memory_profilerはそこそこ信頼できそうだなという気がします。

スポンサーリンク

プログラムを停止させ、Macのアクティビティモニタで確認したメモリ使用量

@profileデコレータを用いてプロファイルを取る

一行単位でメモリ資料量を監視してプログラムを改善するために、memory_profilerの@profileデコレータを用いる手法を紹介します。

サンプルソース

監視したい処理を関数にして、@profileデコレータを付けます。プロファイラは処理を複数回繰り返して検証することで処理時間が長くなるため、先程より1桁少ない10万個のデータを配列に追加した場合を検証してみました。

実行結果

端末から上のサンプルソースを実行した結果は次のようになりました。10万個の配列データを作るところで3.9MiB、20万個の配列データを作るところで7.4MiBと表示されほぼ2倍になっていて、そこそこ信頼できる数値が計測できている気がします。

@profileによる出力

このようにデコレータを用いることで、一行単位でメモリ使用量を推測することができるため、メモリの上限がシビアな場合や大量のデータを読み込む場合には、便利に使えると思います。一度、プログラムがメモリを使いすぎている場合や、実行ができない場合には、変なメモリの使い方をしていないか確認するためにも、使用量を確認してみて下さい。