Python

【初心者向け】Pythonでメモリリークについて学んでみた

メモリとは何か?

メモリという単語を聞いて、何を想像しますか?
少し知識のある方なら、パソコンを購入する際などに選ぶ基準になっているかもしれません。


メモリは、パソコンのパーツの一つで、作業中のデータを一時的に保存しておくためのものです。
CPUは頭脳、メモリは作業机なんて例えをよくされます。メモリは、パソコンの快適さに直結する要素の一つなのです。

PCの仕事を料理で雑に例えると

パソコンの処理を料理で例えます。
CPUは料理人の頭脳、HDD(SSD)は料理人の知識、メモリは調理場です。
たとえ立派な厨房があっても、料理人の頭脳や知識が足りず、段取りが悪ければ、当然料理が出てくるのは遅くなりますよね。


一方、プロの料理人であっても、コンロ一台しか置けない狭い調理場で料理をさせたらどうでしょう?
当然満足に実力を発揮できず、大きな厨房で料理をするのに比べたらはるかに時間がかかることでしょう。

同じことがコンピューターの中で起きています。
少し昔のAndroidを使っていた方なら、メモリ解放をしないと動作が重くなるというのは経験があるかもしれません。

メモリリークとは何か?

さて、本題のメモリリークの説明に入ります。
メモリリークとは、調理場の例えで言うと「調理場が散らかっていて、満足に料理ができなくなる」バグのことです。


プログラムは、実行の中で様々なデータをメモリに保存していきます。
しかし、メモリの容量は限られているので、もう使わないデータを削除していかないと、メモリが一杯になって使えなくなってしまうのです。


このように、プログラムの実行の中でメモリに保存したデータが、メモリ容量を超えてしまうことがメモリリークの原因になります。

初心者がメモリリークを気にする必要はない??

メモリリークとは、プログラムの処理の中でメモリが一杯になってしまい、処理ができなくなってしまうバグの一つと説明しました。

しかし、プログラミング初心者の多くが学ぶRubyやPython、PHPなどといった言語は、ガベージコレクションというメモリ管理の仕組みがしっかりしているため、普段あまり意識する必要はありません。


しかし、最近はデータ分析などで、大規模なデータを扱うためにメモリ管理を徹底する必要のあるプロジェクトも増えているようです。
初心者から中級者を目指す上で、メモリ管理について学ぶことは不可欠と言えるでしょう。

Pythonで学ぶメモリリーク

では、Pythonを例にみていきます。
まずは要素を10個持つ配列のコードを書いて、メモリの消費量を調べます。
メモリの消費量は、tracemallocというライブラリを使って調べています。

test = ["test"] * 10
結果:size=80 B

10個の要素では80バイトのメモリを消費するようです。

では、要素数を一気に増やしてみます。

test = ["test"] * 1000000000
結果:size=7629 MiB

実に8GB近くのメモリを消費しています。
もうそろそろ僕のPCのメモリ(16GB)を超えてしまいそうです。
要素数をもう少し増やしたらどうなるのでしょうか?

test = ["test"] * 100000000000
結果:MemoryError

エラーが返ってきてしまいました。
これがメモリリークです。

大量のデータやサイズの大きなデータを扱う場合は意識していきましょう。