Jupyter Notebook実行結果をクリアする方法
前回、matplotlibの余白を設定する方法を解説しました。
今回はJupyter Notebookの各セルの実行結果をクリアする方法を解説していきます。
なぜこの方法が必要になったかというと、とあるライブラリを使った際、その内部でmatplotlibが使われていたのですが、画像を出力するかどうかのオプションがなく、必ず画像が出力される状態になっていました。
しかもそのプログラムを何十回、何百回と使用するプログラムを書いていたため、膨大な数の画像が実行結果として出力されてしまい、結果、メモリを食い尽くすということが起こってしまいました。
そこでどうしたらいいかなと考えた結果、出力し、画像を保存した後、実行結果をクリアしてしまえばいいんじゃないかと考えついたわけです。
ということで実行結果をクリアする方法を調べてみたというのが今回のお話しです。
それでは始めていきましょう。
IPython.display clear_output
Jupyter Notebookの各セルの実行結果をクリアするには「IPython.displayのclear_output」を使います。
clear_outputは引数としてbool値を取りますが、デフォルトがFalseなので、記述する際の値としては「True」だけを使用します。
つまり実行結果をクリアしたい場合は「clear_output(True)」とするわけです。
それでは試してみましょう。
import time
from IPython.display import clear_output
for i in range(100):
clear_output(True)
print(i)
time.sleep(0.1)
実行結果
99
0から99までを繰り返し、その値を表示するプログラムです。
繰り返しの最初に「clear_output(True)」とすることで実行結果をクリアしています。
これを実行すると実行結果には0から99までカウンタのごとく数字が増加していく様が見えます。
もし「clear_output(True)」がないと、0から99までずらっと縦に表示されるプログラムになります。
matplotlibでのclear_output
それではmatplotlibで出力したグラフの画像でも clear_outputでクリアできるのか試してみましょう。
import random
import matplotlib.pyplot as plt
from IPython.display import clear_output
%matplotlib notebook
for i in range(100):
x_val = range(100)
y_val = [random.randrange(100) for _ in x_val]
fig = plt.figure()
plt.clf()
plt.plot(x_val, y_val)
plt.savefig(f'./test2/{i}.png')
clear_output(True)
このプログラムでは100個のデータでY値がランダムであるグラフを100回作成し、保存しています。
そしてその後「clear_output(True)」で実行結果をクリアしています。
これを実行すると何度もグラフを描写しますが、グラフが何個も実行結果に表示されることはなく、グラフの保存が行われます。
出力するグラフの数が数百枚、数千枚と大量になるにつれ、Jupyter Notebook自体がメモリ不足で落ちるようになりますが、これで防ぐことができます。
fig = plt.figure()を書ける場合のより効率の良い書き方
今回はライブラリ内にmatplotlibのグラフ描写部分が埋め込まれており、必ずグラフが表示されてしまう際に有効な手立てとして実行結果をクリアする方法を紹介しました。
ですが自分でグラフを作成する場合、つまり「fig = plt.figure()」を記述する場合で大量に画像を出力したい場合はさらに効率の良いやり方があります。
それは「fig = plt.figure()」は一度だけにして、そのグラフエリアにグラフを描き直すというやり方です。
つまりプログラム的にはこうなります。
import random
import matplotlib.pyplot as plt
%matplotlib notebook
fig = plt.figure()
for i in range(100):
x_val = range(100)
y_val = [random.randrange(100) for _ in x_val]
plt.clf()
plt.plot(x_val, y_val)
plt.savefig(f'./test3/{i}.png')
今回メモリ使用量の比較はしませんが、「fig = plt.figure()」で何度もグラフエリアを作成するのがメモリを圧迫する原因の一つですので、これは結構効果的です。
ちなみにこちらの記事でメモリ使用量の比較をしていますので、よかったらどうぞ。
matplotlibで何百枚もグラフを出力すると結構メモリを消費しますが、どう使うかによって対処が異なってくるので、色々な方法を知っておくのがいいかと思います。
次回はPyAutoGuiを使ったPythonからのマウス、キーボード操作を紹介します。
ではでは今回はこんな感じで。
コメント