Pythonで大きなファイルを効率的に処理する方法!初心者でもわかるメモリ節約テクニック
生徒
「Pythonで大きなファイルを読み込むと、パソコンがすごく重くなったりフリーズしたりするんですけど…」
先生
「それは一度に全部読み込もうとして、パソコンのメモリに負担がかかっているのかもしれません。大きなファイルは少しずつ処理すると効率的ですよ。」
生徒
「少しずつって、どうやってやるんですか?」
先生
「それでは、Pythonでメモリ効率を考えたファイル処理の方法を順番に説明していきましょう!」
1. なぜ大きなファイルは注意が必要?
パソコンには「メモリ」と呼ばれる作業スペースがあります。Pythonで大きなファイルを一気に読み込むと、このメモリを大量に使ってしまい、パソコンが重くなったりフリーズしたりする原因になります。
特にテキストファイルやログファイル、CSVファイルなどが何百MB〜数GBあると、初心者の方が普通にread()で読み込むと危険です。
2. ファイルを1行ずつ読み込む方法
Pythonでは、for文を使ってファイルを1行ずつ順番に読み込むことができます。これならメモリをほとんど使わず安全です。
with open("bigfile.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
with open()を使うことで、ファイルの開けっぱなしも防げて安心です。line.strip()は、余分な改行を取るおまじないのようなものです。
3. readline()を使う方法
readline()を使うと、1行ずつ自分のタイミングで読み込むこともできます。こちらはもう少し細かい制御がしたいときに便利です。
with open("bigfile.txt", "r", encoding="utf-8") as f:
while True:
line = f.readline()
if not line:
break
print(line.strip())
readline()は1回呼び出すごとに1行だけ読み込む仕組みです。
4. chunk(チャンク)で一定サイズずつ読み込む
バイナリファイルやテキストファイルの一部を、指定したサイズずつ読み込むこともできます。これを「チャンク読み」と言います。
with open("bigfile.txt", "r", encoding="utf-8") as f:
while True:
chunk = f.read(1024) # 1024文字(約1KB)ずつ読み込む
if not chunk:
break
print(chunk)
f.read(1024)とすることで、メモリを節約しながら読み込めます。全部を一気に読む必要はありません。
5. 書き込みもチャンクでできる
読み込みだけでなく、書き込み(保存)もチャンクに分けて行うことで効率的に処理できます。
with open("bigfile.txt", "r", encoding="utf-8") as source, open("copy.txt", "w", encoding="utf-8") as target:
while True:
chunk = source.read(2048) # 2KBずつ読み込む
if not chunk:
break
target.write(chunk)
このように、読みながら書くことで、途中で止まることなく大きなファイルをコピーできます。
6. 大きなCSVファイルを読み込むときのコツ
CSVファイルは行ごとに区切られているので、1行ずつ読み込むのが最もメモリ効率が良いです。
Pythonのcsvモジュールを使えば、表のようなデータも簡単に扱えます。
import csv
with open("data.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
rowはリスト形式で1行分のデータが入っています。巨大なデータも安心して処理できます。
7. メモリ節約のためにやってはいけない読み方
初心者がよくやってしまうのが、次のように全体を一度に読み込む方法です:
f = open("bigfile.txt", "r", encoding="utf-8")
data = f.read()
f.close()
これは数百MBのファイルならOKかもしれませんが、数GB以上あるとフリーズやメモリエラーになる危険があります。
なるべく1行ずつ、もしくはチャンクでの読み込みを使いましょう。
8. ファイル処理を効率化する追加のヒント
- 圧縮ファイル(.zipや.gz)も
gzipやzipfileモジュールで直接読み込める - データを処理しながら保存することで、保存後のファイルサイズも減らせる
- ログファイルのように増え続けるファイルには、
seek()やtail -fのような仕組みも活用できる
Pythonはシンプルなのに、効率的に大きなファイルも扱える柔軟さを持っています。
まとめ
大きなファイル処理で身につけたい基本的な考え方
今回の記事では、Pythonで大きなファイルを効率的に処理するための考え方と具体的な方法について学んできました。 パソコンのメモリには限りがあり、巨大なテキストファイルやログファイル、CSVファイルを一度に読み込むと、 動作が重くなったりフリーズしたりする原因になります。 そのため、大きなファイルを扱うときは「一気に全部読む」のではなく、「少しずつ読みながら処理する」 という意識を持つことがとても重要です。
Pythonでは、for文を使った1行ずつの読み込みや、readlineによる逐次処理、 さらに一定サイズごとに読み込むチャンク読みといった方法が用意されています。 これらを使うことで、メモリ使用量を抑えながら安全にファイル処理を行うことができます。 特に初心者の方は、readメソッドで全体を読み込む方法と、 1行ずつ処理する方法の違いをしっかり理解しておくことが大切です。
チャンク処理と行単位処理の使い分け
テキストファイルやCSVファイルのように行単位で意味を持つデータは、 for文を使って1行ずつ読み込む方法が最も分かりやすく、メモリ効率も良いです。 一方で、サイズの大きなテキストデータやバイナリデータを扱う場合は、 チャンク処理を使って一定サイズずつ読み込むことで、柔軟な制御が可能になります。 読み込みと同時に書き込みを行えば、巨大なファイルのコピーや変換処理もスムーズに実行できます。
このような処理方法を知っておくと、ログ解析やデータ変換、バックアップ作成など、 実務で役立つ場面が一気に広がります。 Pythonは初心者向けの言語でありながら、工夫次第で非常に高性能なファイル処理ができる点が魅力です。
まとめとしてのサンプルプログラム
with open("large_data.txt", "r", encoding="utf-8") as source, \
open("result.txt", "w", encoding="utf-8") as target:
for line in source:
if line.strip():
target.write(line)
このサンプルでは、大きなファイルを1行ずつ読み込み、 空行を除外しながら別のファイルへ書き込んでいます。 メモリをほとんど消費せずに処理できるため、 ファイルサイズが大きくなっても安定して動作します。 このような書き方に慣れておくことで、 Pythonでのファイル処理に自信が持てるようになります。
生徒
「大きなファイルを扱うときは、全部を一気に読むのが危ないっていう理由がよく分かりました。 少しずつ処理するだけで、パソコンへの負担が全然違うんですね」
先生
「その理解はとても大切です。 ファイルサイズが小さいうちは問題にならなくても、 実務では何百メガバイトや何ギガバイトのデータを扱うことも珍しくありません」
生徒
「1行ずつ読む方法と、チャンクで読む方法を使い分けられるようになりたいです」
先生
「ぜひ意識して使ってみてください。 今回学んだメモリ節約の考え方は、 Pythonで安定したプログラムを書くための大きな武器になりますよ」