【Python入門】メモリの解放や効率的に使う方法をマスターしよう!

こんにちは! プログラマーのakiraです。

Pythonでアプリケーションを快適に動作させるためには、メモリの操作・開放についての知識は必要になります。

ガベージコレクションってなんだろう?
メモリ解放ってどうやってやるんだろう?
どうやってメモリを効率的に使用すればいいのだろう?

と疑問に思ったことはないでしょうか?そんな方に向けて、基礎からメモリの開放や効率的に使う方法について以下の内容で解説していきます。

  • 【基礎】メモリの基礎
  • 【実践】Pythonでメモリを開放する方法
  • 【実践】メモリを効率的に使う方法

本記事ではPythonでメモリを扱う方法について、初心者でもわかりやすく解説していますので、ぜひ参考にしてください!

メモリについて考えてみよう!

メモリとは

メモリとはPC上でデータを一時的に記憶しておく場所です。変数などに格納したデータを高速に処理する必要があるプログラミング処理ではメモリとうまく付き合っていくことが重要になるのです!

それではこれからプログラミングとメモリの関係について詳しく見ていきましょう!

ガベージコレクションとは

ガベージコレクションとはあるプログラムで確保したメモリの内、不要になったメモリを自動的に解放してくれる機能になります。プログラミングをしていると変数にデータを格納したり、ファイルからデータを読みこんだりして、メモリ上に必要なデータを読み込んで、様々な処理を実行します!

しかしメモリへ読み込んだデータは必要な処理が完了したら、その後の処理では必要のないゴミデータとなってしまいますよね?そこでPythonなどの言語では、Garbage Collector(ごみを集める人)が登場するわけです。PCなどのメモリは無限に使えるわけではなく、数ギガバイトなどの限界があると思います。

このガベージコレクタが不要になったゴミデータをメモリから開放してくれることで、メモリ上にゴミデータが溢れてしまうことを防ぐのです!

メモリリークとは

「ガベージコレクションとは」で、ガベージコレクタが不要になったゴミデータをメモリから開放してくれる役割を担っていることを説明しました。それでは、メモリ上にゴミデータが溢れてしまった場合はどうなるのでしょうか?メモリの使用可能な容量がどんどん減っていってしまいますよね?

この使用可能なメモリ領域がどんどん減っていき、PCやサーバなどの不具合を招くバグをメモリリークというのです!

Pythonでメモリ解放の方法を確認しよう!

これまで説明してきたようにPythonにはGC(ガベージコレクション)の機能があるため、メモリ開放はC言語などのように手動で実施することなく、大抵はGCが自動で行ってくれます。そのため普段はメモリについて大きく意識することなくプログラミングの処理を書くことに専念できるのです!

しかし大量のデータを扱う場合やメモリ制限のある環境では、GCの判断で開放を行うのではなく、必要なくなったタイミングで即座に開放したい場合も出てきます。次項でPythonのメモリを手動で開放する方法について見ていきましょう!

delで要素を削除してみよう!

それではdelで要素を削除する方法について見ていきましょう。以下のようにすることで、delで要素を削除することができます。

それでは次のサンプルコードを見ていきましょう!
delでdel_testを削除後、del_testが参照できなくなっていることがわかるかと思います!

実行結果

gc.collectでメモリ解放してみよう!

それでは、メモリを開放する方法について見ていきましょう!

まずdelで解放したい要素を削除し、gc.collect()でメモリを強制的に開放することにより、メモリを再利用することができるようになります!

メモリを効率的に使う方法を検討してみよう!

今度はメモリを効率的に使う方法について考えていきましょう。プログラミングでメモリ問題を引き起こすものの一つとして、巨大なファイルの読み込みがあります。メモリに乗らないような数十GBの巨大なファイルを一気に開きメモリが足りなくなってしまうと、メモリリークなどの不具合を引き起こしてしまうことがあります!

最悪の場合、サーバ上の処理全体が停止し、サービス止まってしまう場合もあるのです。Pythonでメモリを効率的に使用する方法をマスターして、メモリエラーを未然に防げるようにしましょう!

それでは、次項以降で読み込みに使用するサンプルのCSVを以下のコードより作成しておいてください!

以下のような内容が記載されたCSVファイルが作成されます!

sample.csv

yieldを使う

それでは、yieldを使用してメモリを効率的に使う方法を考えていきましょう!

yieldとは処理を一時的に停止させて値を返すことができる機能です。またこのyieldを使用するとジェネレータという反復可能なオブジェクトを作ることができます!

yieldやジェネレータって何?という方はこちらの記事を見てください!

では、サンプルコードを見ていきます!

関数file_generatorではファイルを渡すとファイルの中身を一行ずつ返してくれるジェネレーターを生成します。実行結果は、print(next(gen))でsample.csvの1、2、3行目を表示しています!

実行結果

このようにyieldを使用してファイルの中身を一行ずつ返すジェネレーターを作成することによって、ファイル全体をメモリ上に読み込む必要がなくなるのです!

次は作成したジェネレーターをfor文でループしてみましょう!
ファイルの中身を一行ずつ取得し、全行表示することができます!

実行結果

pandasでchunksizeを指定する

次は、pandasを使用してメモリを効率的に使う方法を考えていきましょう。pandasとはデータを効率的に処理できるPythonのデータ分析ライブラリです。

pandasって何?という方は、以下のページに詳しく解説されています!

またpandasのread_csvでCSVを扱う方法は、以下のページに解説されています!

それではサンプルコードを見ていきましょう。pandasは、csvファイルを読み込む際にchunksizeという一度にメモリ上に読み込む行数を指定できます。今回は、chunksizeを10に指定しているため一度に10行ずつ読み込む事かできます!

実行結果

print(next(reader))を2回実行しているため、10行ずつ0~9、10〜19行を読み込むことができていますね。次のように全行取得したい場合は、for文でループすることにより10行ずつ全行を取得することができます!

実行結果

daskを使用する

今度はdaskを使用した効率化の方法を考えていきましょう!

daskとは柔軟な並列計算を行うライブラリです。つまり、daskではメモリに乗らないようなファイルでもdask側で調整して分散処理を行ってくれるため、巨大なファイルも扱うことができるようになります。メモリ上に読み込む量もdask側で調整してくれるため柔軟な処理が可能となります!

それでは、daskを使用してサンプルのCSVファイルを読み込んでみましょう!

実行結果

このようにdaskが調整してファイルを読み込み、分散処理をしてくれるため巨大なファイルも高速に扱うことができるのです!

まとめ

いかがでしたでしょうか。今回は、Pythonのメモリについて学習しました!

メモリについて考えたり、メモリを意識したプログラミングをすることは、初級から中級プログラマにステップアップする上でも大切なことですので、しっかり理解して活用できるようにしていきましょう!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

akira

akira

インフラエンジニア→プログラマー。趣味は3歳の子供にPCの使い方、タイピングを教えること。業務ではPython, PHP, Javaなどやってます。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説