【Python】ライブラリをインストールせずにメモリ使用量を追跡する(Python3.4以上)

【Python】ライブラリをインストールせずにメモリ使用量を追跡する(Python3.4以上)


# python

対応バージョン

Python3.4以上

Pythonでメモリ使用量を追跡したかった

それなりに重いデータをいじろうとすると、メモリの使用量が気になる事が多々あります。

秒単位で計測することはLinuxコマンドで比較的簡単に出来ますが、具体的にどの処理の後にメモリの使用量が増えているかを知りたく、Pythonの関数化してみました。

標準モジュールでのメモリ追跡の方法

tracemalloc という標準モジュール(Python3.4で追加)を使用します。

「Python が割り当てたメモリブロックをトレースするためのデバッグツール」が目的のモジュールらしいです。

書いてる途中で気が付いたのですが、公式ドキュメントのサンプルが充実しすぎてたのでそちらを見ましょう… 合計値のみ簡易的に出したい!!って方は以下のコードが参考になるとは思います。多分。

融通が利かない部分はあるらしいですが、追加でライブラリをインストールする必要がなくそれなりの情報が手軽に利用できます。

以下のような感じのコードでメモリ使用量が表れてくれます。 メモリを計測する際は「tracemalloc.start()」を実行してから実処理を回すようにしましょう。

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))
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()

出力結果

 

-- 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すげえ重いですね。でも便利だからね、仕方ないね。上手く付き合わねば。