Tips

今日の開発Tips(2025-08-01)

巨大なログファイルやCSVファイルなどを処理する際に、ファイル全体をメモリに読み込むとメモリ不足になることがあります。 このような状況では、ファイルポインタを適切に管理することで、メモリ消費を抑えつつ効率的にデータ処理を行うことが重要です。 少量ずつデータを読み込み、処理する手法は、大規模データ処理において必須のテクニックです。

効率的なファイル処理によるメモリ節約

ファイル全体を読み込む代わりに、with open(...)文とreadlines()メソッドの組み合わせではなく、ファイルポインタを逐次的に読み進めることでメモリ使用量を大幅に削減できます。

def process_large_file(filepath, chunk_size=1024):
    with open(filepath, 'r', encoding='utf-8') as f:  # エンコーディングを指定しましょう
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            # chunk を処理する
            for line in chunk.splitlines():
                # 各行の処理
                process_line(line)

def process_line(line):
    # ここに各行に対する処理を記述
    print(line.strip())


# 使用例
process_large_file("large_file.log")

chunk_sizeは読み込むチャンクサイズをバイト単位で指定します。値を調整することで処理速度とメモリ使用量のバランスを取ることができます。 encodingを適切に設定することで文字化けを防ぎましょう。 splitlines()は改行コードを考慮して行を分割します。 処理内容に応じてprocess_line関数を変更してください。

注意点:チャンクサイズが小さすぎると、ファイル入出力のオーバーヘッドが増加し処理が遅くなる可能性があります。逆に大きすぎると、メモリ消費が増加する可能性があります。最適なchunk_sizeはファイルの種類や処理内容によって異なるため、実験を通して最適な値を見つける必要があります。