Tips
今日の開発Tips(2025-07-31)
巨大なログファイルなどを処理する際に、ファイル全体を読み込むのではなく、必要な行だけを逐次処理することでメモリ使用量を削減できます。 `seek()`メソッドと`readline()`メソッドを組み合わせることで、特定の行数から読み込みを開始したり、行単位で処理を進めることが可能です。これにより、メモリ不足によるクラッシュを防ぎ、大規模データ処理を効率化できます。
効率的な巨大ファイル処理: seek()とreadline()の活用
ファイル全体を読み込む代わりに、seek()メソッドで特定の位置に移動し、readline()メソッドで1行ずつ読み込むことで、メモリ使用量を抑えながら巨大なファイルを処理できます。
def process_large_file(filepath, start_line=0, num_lines=1000):
with open(filepath, 'r') as f:
f.seek(0) # ファイルの先頭に移動(必要に応じて)
for i in range(start_line):
f.readline() # 開始行までスキップ
for i in range(num_lines):
line = f.readline()
if not line:
break # EOFに達した場合
# 行の処理
print(f"Processing line: {line.strip()}")
# 使用例: 1000行目から100行処理
process_large_file("large_log.txt", start_line=999, num_lines=100)
注意点: エンコーディングを考慮し、必要に応じてencoding引数をopen()関数に指定してください。seek()はファイルの先頭からのバイトオフセットを指定するため、行数が不明な場合は事前にファイルサイズや行数を把握する必要があります。 特定の条件に合致する行だけを処理したい場合は、readline()で読み込んだ行に対して条件判定を追加する必要があります。 また、非常に大きなファイルで、処理に時間がかかる場合は、マルチスレッドやマルチプロセス処理を検討しましょう。