大きなログファイルを使用してシークを高速化する方法


15

私は非常に大きなログファイル(3 GBを超える)を頻繁に処理しています。これらのファイルでは、lessのパフォーマンスがひどいことに気付きました。多くの場合、ファイルの中央をジャンプしたいのですが、15 M行先にジャンプするように言わない場合、数分かかります。

私が想像する問題は、「\ n」文字のファイルをスキャンする必要が少なくなりますが、時間がかかりすぎることです。

明示的なオフセットを求めるだけの方法はありますか?たとえば、ファイル内の15億バイトのオフセットをシークします。この操作は、桁違いに速いはずです。lessがそのような能力を提供しない場合、提供する別のツールはありますか?


禁じられているキャラクターを探してファイルをスキミングしている場合、前述のキャラクターを見つけた後にそれらをパージするのは公正な仮定ですか?もしそうなら、私は提供することができますperl -pi -e 's/\n//g;' <filename>
マイクペニントン

すみません、スキムは間違った言葉でした。スキャンを使用する必要がありました。改行(\ n)の設計スキャンにより少なくなります。このスキャンは、大きなファイルでは非常に長い時間がかかります。
UsAaR33

回答:


20

このように行を数えるのを止めることができます less -n

たとえば50%のような特定の場所にジャンプするにはless -n +50p /some/log、1.5GBのログファイルでこれを即座に実行しました。

編集:特定のバイトオフセットの場合: less -n +500000000P ./blah.log


1
行カウントが問題になることはありませんでした。そのためには、escp / ctrl-cを使用できます。しかし、これは実際の答えです。Pは特定のバイトオフセットにジャンプします!
UsAaR33

5

ポケットベルであることは、本質的に行指向です。起動時に大きなファイルの場合は「行番号をカウントしています」と表示され、ESCを押して停止しますが、そうでない場合は行を実行します。それがすることです。

ファイルの真ん中に直接ジャンプして先頭をスキップする場合は、常に先頭を過ぎてシークできます。私のような何かをしたいと思いますtail -c +15000000 /some/log | less


3
あなたが意味するtail -c ...か、奇妙なlastコマンドを持っています。
アランカレー

この戦略の問題点は、(特定のメッセージなどを検索)以内から、もうファイル全体に求めることができないということです
Sekenre

@AlanCurry:それは単なる代替スペルです... <grin>
womble

0

less ロケール設定による小さなオーバーヘッドがあるようです

ASCIIのみの文字を使用している場合は、次を使用して少し高速化できます。

LC_ALL=C less big-log-file.log

私の場合、スループットは〜30M ib / sから〜50 Mib / sに増加しました(レートはCPUバウンドです)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.