重複の可能性:
テールを効率的に実装するにはどうすればよいですか?
私の友人は、彼がどのように実装するか尋ねられましたtail -n
。n
明確にするために、指定されたファイルの最後の行を印刷する必要があります。
n個の文字列の配列を使用して、それらを循環的に上書きすることを考えました。しかし、たとえば10 GB
ファイルが与えられた場合、このアプローチはまったく拡張できません。
これを行うためのより良い方法はありますか?
重複の可能性:
テールを効率的に実装するにはどうすればよいですか?
私の友人は、彼がどのように実装するか尋ねられましたtail -n
。n
明確にするために、指定されたファイルの最後の行を印刷する必要があります。
n個の文字列の配列を使用して、それらを循環的に上書きすることを考えました。しかし、たとえば10 GB
ファイルが与えられた場合、このアプローチはまったく拡張できません。
これを行うためのより良い方法はありますか?
ファイルをメモリマップし、行末n
時間を探して最後から繰り返し、その時点からファイルの終わりまでを標準出力に書き込みます。
ファイル全体をマッピングするのではなく、メモリの最後の X kb (メモリ ページ数など) だけをマッピングしてそこをシークすると、ソリューションが複雑になる可能性があります。十分な行がない場合は、必要なものが得られるまで、より大きな領域をメモリ マップします。ヒューリスティックを使用して、マップするメモリ量の推測を実装できます(大まかな見積もりとして、1 行あたり 1kb とします)。私は本当にこれをしません。
「状況次第」、間違いない。ファイルのサイズがわかっている必要があり、文字通り各バイトを順番にトラバースしたり、仮想メモリをスラッシングしたりすることなく、非常に大きなファイルの最後まで「シーク」できる賢明なファイル操作ライブラリがあれば、改行のカウントを終了します。
しかし、それほど大きなファイルを扱っている場合n
、数ギガバイトのファイルの行数に近い縮退したケースについてはどうしますか?一時的な文字列にデータを保存しても、スケーリングは行われません。