組み込み開発のための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手を動かす課題
空行と不正行を含む大きなダミーファイルを作り、行番号を示して処理を止めることを確認してください。