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はシンプルなのに、効率的に大きなファイルも扱える柔軟さを持っています。