
ユースケース:1週間にわたって数GBのログファイルがあり、たとえばgrep
知識に基づいて推測してファイルの途中で検索を開始すると、処理時間が半分以上短縮されるとします。関連データをスキップせずにファイルセクションの残りの部分全体を処理する必要はありません。可能ですか?
答え1
データが時系列でソートされているとします。
- 最後を見て、次のようにしてファイルサイズを確認してください
ftell()
。 - 結果を2で割ります。
fseek()
場所を見つけるために使用されます。- 一度呼び出して、次の行の先頭を見つけます
getline()
。 strptime()
現在の日付を知るために使用されます。- バイナリ検索を実行し、目的の行が見つかるまで手順4と5を繰り返します。
答え2
dd
次のように使用できます。
dd if=log skip=xK bs=1M
その後、サイズが1M(2 ^ 20)のx * 1024ブロックをスキップします。dd(1)
デバイスの取り扱いの詳細については、参考資料をご覧ください。
<date> [data]
ログが出力をパイプできる一般的な形式であると仮定してバイナリ検索を自動化するには、ログの先頭のhead -n 2
日付を確認してください。第二行(「通常」長い行が完了するという合理的な仮定の下で)必要な半分を決定します。
答え3
ファイルサイズを求めて2で割ります。これを1024で割ってKiBを得る。 (またはMiBなどを取得するには1024 * 1024)
((fs = $(stat -c %s logfile) / 2 / 1024))
スキップして検索してみてください
dd if=logfile bs=1024 skip=$fs | grep blahblah
ログファイルが次の場合は、さらに拡張できます。非常にデータ量はprと一致します。日count=
に値を追加することによってdd
。
((cnt = $(stat -c %s logfile) / 5 / 1024))
dd if=logfile bs=1024 skip=$fs count=$cnt | grep blahblah
これはcnt * 1024
オフセットバイトでデータバイトを転送しますfs * 1024
。
すべてをスクリプトでラップし、スクリプトの外側のパイプをgrep、一時ファイル、または必要に応じて実行します。
答え4
正確に何をしたいのか、「プロセス」が何を意味するのかは不明です。私が好きな大容量ファイル用のインタラクティブプログラムですless
。このプログラムは大容量ファイルを問題なく処理します。たとえば、を使用して特定の割合に移動することもできます30%
。また、/
を使って検索できます?
。