組み込み開発のためのPython · レッスン 211 / 220

イテレーターで大きなログを逐次処理する

全件をメモリに載せず、レコードを一つずつ読みながら検査します。

長時間の計測ログを一度にリストへ読み込むと、メモリを使い切ることがあります。イテレーターやジェネレーターを使い、必要な分だけ処理します。

反復可能なデータを順に読む

ファイルオブジェクトは一行ずつ反復でき、`yield`を使ったジェネレーターは値を必要になった時点で生成します。これによりピークメモリを抑えられます。ただし、同じイテレーターを二度走査できるとは限らないため、再読込が必要ならファイルを開き直すなど意図を示します。

不正行を黙って捨てない

逐次処理でも行番号や入力元を記録すれば、壊れたデータを追跡できます。異常行をスキップする運用を選ぶ場合は、スキップ数を集計して結果に含め、破損を隠さないようにします。大量入力では処理時間やキャンセル方法も考慮します。

コード例

手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。

from pathlib import Path
from collections.abc import Iterator


def readings(path: Path) -> Iterator[int]:
    with path.open(encoding="utf-8") as file:
        for line_number, line in enumerate(file, start=1):
            text = line.strip()
            if not text:
                continue
            try:
                yield int(text)
            except ValueError as exc:
                raise ValueError(f"{line_number}行目が整数ではありません") from exc

手を動かす課題

空行と不正行を含む大きなダミーファイルを作り、行番号を示して処理を止めることを確認してください。

参考資料

「6. 型・クラス・データ処理の設計」の章一覧へ