2

重複の可能性:
テールを効率的に実装するにはどうすればよいですか?

私の友人は、彼がどのように実装するか尋ねられましたtail -nn明確にするために、指定されたファイルの最後の行を印刷する必要があります。

n個の文字列の配列を使用して、それらを循環的に上書きすることを考えました。しかし、たとえば10 GBファイルが与えられた場合、このアプローチはまったく拡張できません。

これを行うためのより良い方法はありますか?

4

2 に答える 2

6

ファイルをメモリマップし、行末n時間を探して最後から繰り返し、その時点からファイルの終わりまでを標準出力に書き込みます。

ファイル全体をマッピングするのではなく、メモリの最後の X kb (メモリ ページ数など) だけをマッピングしてそこをシークすると、ソリューションが複雑になる可能性があります。十分な行がない場合は、必要なものが得られるまで、より大きな領域をメモリ マップします。ヒューリスティックを使用して、マップするメモリ量の推測を実装できます(大まかな見積もりとして、1 行あたり 1kb とします)。私は本当にこれをしません。

于 2012-07-30T15:42:32.517 に答える
2

「状況次第」、間違いない。ファイルのサイズがわかっている必要があり、文字通り各バイトを順番にトラバースしたり、仮想メモリをスラッシングしたりすることなく、非常に大きなファイルの最後まで「シーク」できる賢明なファイル操作ライブラリがあれば、改行のカウントを終了します。

しかし、それほど大きなファイルを扱っている場合n、数ギガバイトのファイルの行数に近い縮退したケースについてはどうしますか?一時的な文字列にデータを保存しても、スケーリングは行われません。

于 2012-07-30T15:47:08.750 に答える