大規模ファイルの行数を効率的にカウントする方法

Pythonで大規模ファイルの行数をカウントする際、パフォーマンスとメモリ使用量を最適化するためにさまざまなアプローチがあります。ここでは、基本的な方法から高度なテクニックまで紹介します。

基本的な方法 - forループとsum()

一番シンプルな方法は、ファイルを開き、各行に対してsum()を使用してカウントするものです。この方法はシンプルで理解しやすいですが、大きなファイルでは処理に時間がかかることがあります。

num_lines = sum(1 for _ in open('myfile.txt'))
print(num_lines)

このコードは、ファイル内の各行を1行ずつ読み込み、行ごとにカウントを増やしていきます。

メモリ効率を考えた方法 - バッファリング

メモリ効率を向上させるために、ファイルをバッファごとに読み込み処理することができます。次のコードでは、ファイルをバッファサイズごとに分割し、メモリの使用を最小限に抑えながらカウントします。

def buf_count_newlines(fname):
    with open(fname, 'rb') as f:
        buf_size = 1024 * 1024  # 1MBごとのバッファ
        count = 0
        buf = f.read(buf_size)
        while buf:
            count += buf.count(b'\n')
            buf = f.read(buf_size)
    return count

この方法は、バッファを使ってファイルを小さな部分に分割して読み込み、メモリ使用量を削減しながら高速にカウントします。

高速化のためのテクニック - mmapの利用

さらに高速な方法として、mmapを使ってファイルをメモリマップし、直接メモリ上で行数をカウントすることが可能です。mmapは、特に大きなファイルを処理する場合に有効です。

import mmap
def mmap_count(fname):
    with open(fname, "r+") as f:
        buf = mmap.mmap(f.fileno(), 0)
        return buf.read().count(b'\n')

この方法では、ファイル全体をメモリマッピングして高速に行数をカウントできますが、メモリ使用量が増える場合があります。

結論

大規模ファイルの行数をカウントするための基本的な方法から、高速かつメモリ効率の良い方法まで、Pythonにはさまざまなアプローチがあります。用途に応じて最適な手法を選びましょう。