Python Jupyter Lab (Notebook) でメモリリーク?


環境

現象

Jupyter Labを使っていて、変数を定義したのちdelしてgc.collect()してもメモリが解放されない。

再現手順

1つのセルの中に以下のようなコードを書いて実行する。

import numpy as np
import pandas as pd
import psutil
print(psutil.Process().memory_info().rss / 1024**2)
df = pd.DataFrame(np.arange(50000000).reshape(-1,5))
df.head()

最後にdf.head() としていることに注意。

次のセルで

print(psutil.Process().memory_info().rss / 1024**2)
del df
print(psutil.Process().memory_info().rss / 1024**2)

メモリの状況はすぐに表示されないので念のためさらに次のセルでも確認

print(psutil.Process().memory_info().rss / 1024**2)

※ちなみに引き続いてgc.collect()しても同じ。

原因

pandas.DataFrame の問題かと思ったが、そうではない。
「セル」の最後にJupyter Labの機能による出力表示を行うと、それ以後他のセルでdelしても解放されないようだ。

解決策

セルの最後でdf.head()しない。表示したければprintする。

コメント

  • 地味に不安要素になる部分・挙動だけれど、きちんとJupyter 入門すると注意されていることなのだろうか(知らない)。
  • 手元で調査して確認できたが、gc対象とならない理由はjupyterの画面表示機能に参照が保持されるか何かだろうか。IPythonに原因があるらしい。検索語をJupyter memory leakとすれば https://github.com/jupyter/notebook/issues/3713 が出てきて、この先に説明があるらしい(見てない)。
  • 検索語をpandas memory leak とすると https://stackoverflow.com/questions/14224068/memory-leak-using-pandas-dataframe などが出てきて、迷い続ける(迷った)。