抽出すると 25GB を超える 7GB の gzip syslog ファイルがあります。ファイル全体を一度にメモリに読み込まずに、ファイルの最初と最後の行だけを取得する必要があります。
GzipFile()
Python 2.7 ではwith
、ヘッドを読み取るために を使用できます (with
ファイル全体を読み取る必要がないことを意味します)。
>>> from itertools import islice
>>> from gzip import GzipFile
>>> with GzipFile('firewall.4.gz') as file:
... head = list(islice(file, 1))
>>> head
['Oct 2 07:35:14 192.0.2.1 %ASA-6-305011: Built dynamic TCP translation
from INSIDE:192.0.2.40/51807 to OUTSIDE:10.18.61.38/2985\n']
AttributeError: GzipFile instance has no attribute '__exit__'
( GzipFile () は GzipFile()でのwith
反復をサポートしていないため)...
>>> from itertools import islice
>>> from gzip import GzipFile
>>> class GzipFileHack(GzipFile):
... def __enter__(self):
... return self
... def __exit__(self, type, value, tb):
... self.close()
>>> with GzipFileHack('firewall.4.gz') as file:
... head = list(islice(file, 1))
これに関する問題は、末尾を取得する方法がないことです...islice()
負の値をサポートしていないため、25 GB のファイルを反復せずに最後の行を取得する方法が見つかりません (時間がかかりすぎます)。
ファイル全体をメモリに読み取ったり、すべての行を反復処理したりせずに、gzip テキスト ファイルの末尾を読み取る最も効率的な方法は何ですか? これができない場合は、その理由を説明してください。