Pythonで大きなファイルを効率的に処理する方法!メモリ効率を考えた読み書き入門
先生と生徒の会話形式で理解しよう
生徒
「先生、Pythonでとても大きなファイルを扱うとき、普通に読み込むとパソコンが重くなるのですが、どうすれば効率よく処理できますか?」
先生
「それは良い質問です。大きなファイルを一度に全部メモリに読み込むと、パソコンのメモリがいっぱいになり、処理が遅くなります。こういう場合は、少しずつファイルを読み込む方法を使うと効率的です。」
生徒
「少しずつ読み込むってどういうことですか?」
先生
「Pythonではfor文で行単位に読み込んだり、read(size)でバイト単位に読み込むことができます。これにより、必要な分だけメモリに乗せて処理できるんです。」
生徒
「なるほど!具体的なコード例はありますか?」
先生
「もちろんです。それでは、順に見ていきましょう。」
1. 大きなファイルを行ごとに処理する方法
テキストファイルを一行ずつ処理する方法です。行ごとに処理するので、ファイル全体を一度に読み込む必要がありません。
with open("large_file.txt", "r", encoding="utf-8") as file:
for line in file:
line = line.strip()
print(line)
ポイント:
for line in fileで1行ずつ読み込むstrip()で余計な空白や改行を削除- 大きなファイルでもメモリを節約して処理可能
2. read(size)でバイト単位に読み込む方法
ファイルがテキストだけでなくバイナリの場合、read(size)で少しずつ読み込むと便利です。sizeは読み込むバイト数です。
with open("large_file.bin", "rb") as file:
while True:
chunk = file.read(1024) # 1KBずつ読み込む
if not chunk:
break
print("読み込んだデータの長さ:", len(chunk))
ポイント:
- 1回に読み込む量を指定することで、メモリ使用量を制御できる
- ファイルの終わりは
chunkが空になったときに判定 - 画像や音声などのバイナリファイルにも応用可能
3. with文を使う理由と便利さ
with open(...)を使うと、ファイルを開いた後に自動で閉じてくれるので便利です。ファイルを閉じ忘れると、メモリに余計な負荷がかかることがあります。
with open("example.txt", "r") as file:
data = file.read(100) # 先頭100文字だけ読み込む
4. ジェネレーターでメモリ効率アップ
Pythonのジェネレーターを使うと、さらにメモリ効率を高められます。ジェネレーターは1つずつデータを生成する仕組みで、すべてを一度に保持しません。
def read_large_file(file_path):
with open(file_path, "r", encoding="utf-8") as file:
for line in file:
yield line.strip()
for line in read_large_file("large_file.txt"):
print(line)
ポイント:
yieldを使うと、必要な行だけ生成して処理できる- 大きなファイルでも一度にメモリに乗せない
5. バイナリファイルの効率的な処理
バイナリファイル(画像、音声、動画など)も小さなチャンクに分けて読み書きできます。大量のデータを扱う際にメモリ節約になります。
with open("large_image.jpg", "rb") as file:
while True:
chunk = file.read(4096) # 4KBずつ読み込む
if not chunk:
break
# chunkの処理(例えばコピーや解析)
6. 実用的なアドバイス
- 大きなファイルを扱う場合は、一度に全データを読み込まない
- 行単位、チャンク単位で処理する
with文を使って自動で閉じる- ジェネレーターを活用してメモリを節約
- バイナリファイルでも同じ原則で効率的に処理可能
これらを組み合わせることで、Pythonで大きなファイルを安全かつ効率的に処理できます。