LoginSignup
8
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-11-20

環境

現象

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

image.png

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

次のセルで

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

image.png

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

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

image.png

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

image.png

原因

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

解決策

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

image.png

コメント

  • 地味に不安要素になる部分・挙動だけれど、きちんと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 などが出てきて、迷い続ける(迷った)。
8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1