私は現在、テキスト ファイル内の行数をカウントする非常にシンプルなスクリプトを持っていますenumerate()
:
i = 0
f = open("C:/Users/guest/Desktop/file.log", "r")
for i, line in enumerate(f):
pass
print i + 1
f.close()
約 3,000 万行の 15 GB のログ ファイルを処理するのに約 3 分半かかります。これは毎日のログであり、毎月分析を行う予定なので、2 分以内に処理できれば最高です。コードでは約 15 GB のログを 30 個処理する必要があり、おそらく 1 時間半以上かかります。また、サーバーの時間とメモリ負荷を最小限に抑えたいと考えています。
私も適切な近似/推定方法があれば満足しますが、精度は 4 桁程度である必要があります...
ありがとう!
ベストアンサー1
イグナシオの答え正しいですが、32 ビット プロセスの場合は失敗する可能性があります。
しかし、ファイルをブロック単位で読み取り、\n
各ブロック内の文字数をカウントすると便利な場合があります。
def blocks(files, size=65536):
while True:
b = files.read(size)
if not b: break
yield b
with open("file", "r") as f:
print sum(bl.count("\n") for bl in blocks(f))
あなたの仕事をします。
ファイルをバイナリとして開かないことに注意してください。そのため、\r\n
は に変換され\n
、カウントがより信頼性が高くなります。
Python 3 では、より堅牢にするために、あらゆる種類の文字を含むファイルを読み取るために次の操作を行います。
def blocks(files, size=65536):
while True:
b = files.read(size)
if not b: break
yield b
with open("file", "r",encoding="utf-8",errors='ignore') as f:
print (sum(bl.count("\n") for bl in blocks(f)))