Tips

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

大量のログファイル処理で困っていませんか?ファイルサイズが大きく、メモリ不足になることも…。本Tipsでは、Pythonの`mmap`モジュールを使って、巨大なログファイルを効率的に処理する方法を紹介します。メモリ使用量を抑えつつ、高速にログ解析を行うことができます。

巨大ログファイルの効率的な処理:mmapモジュール活用

Pythonのmmapモジュールを使うと、ファイルをメモリマップし、ファイル全体をメモリに読み込むことなく、必要な部分だけをアクセスできます。これにより、巨大なログファイルの処理でもメモリ不足を防ぎ、高速な処理を実現できます。

import mmap
import os

def process_log_file(filepath):
    with open(filepath, 'r+b') as f:  # バイナリモードで開く
        with mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ) as mm: # ファイル全体をメモリマップ
            for line in iter(mm.readline, b''): # 改行コードを基準に一行ずつ読み込む
                # ログ行の処理
                processed_line = line.decode('utf-8').strip() # バイト列を文字列に変換し、空白を除去
                print(processed_line)

# ログファイルのパス
log_file_path = "huge_log.txt"

# ログファイルの処理
process_log_file(log_file_path)

注意点:

  • ファイルをバイナリモード('r+b')で開く必要があります。
  • decode()メソッドで文字コードを指定する必要があります。ログファイルの文字コードに合わせて変更してください。
  • mmapオブジェクトは、ファイルが閉じられるまで有効です。with文を使って確実に解放しましょう。
  • メモリマップできるファイルサイズにはOSの制限があります。非常に巨大なファイルの場合は、さらに工夫が必要になる可能性があります。

おすすめポイント:

  • メモリ効率が良い:ファイル全体をメモリに読み込まないので、メモリ不足を防げます。
  • 高速な処理:必要な部分だけをアクセスするため、処理速度が向上します。
  • 読み込みと書き込みの両方が可能:mmap.ACCESS_WRITEを指定することで、ファイルの書き込みも可能です。