質問: あるWebアプリケーションで本番サーバーのアプリケーションログファイルをローテーション設定をせずにずっと使いまわしていました。 いつの間にかログファイルのサイズが数十GBになっていました。 ### 質問 ファイルにログを追記するときの書き込み速度はログファイルの容量が大きくなればなるほど遅くなるのでしょうか? ### 補足 テキストファイルのデータ構造がどうなってるのかわからないのですが、LinledListのような感じで最終行のポインタを保存しているのですかね。もしそうならどこに記入するかを判定する時間はO(1)でその要因では特に遅くはならなそうです。 テキストファイルへの情報の書き込みがどのように行われているのかを調べたのですが、どうやらファイルディスクリプタという存在があるというくらいまでしかわかりませんでした。 もし、それを知りたい場合どのように調べたらよいかも教えていただけると助かります。OSにおけるファイルへの書き込み方法みたいなことを勉強する必要があるのですかね。
回答: まあ普通に実装されているファイルシステムにおいては、次のことが言えそうです。 - 追記すべき場所を探す時間は増えるだろう(シークに要する時間は増える) - 追記をし続けている限りにおいては速度は(小さいファイルと)変わらないだろう ハードディスク(や SSD )上にファイルが置かれるとき - ファイルの内容(提示例では数十 GB になったもの) - ファイル自体の情報(ファイル名、権限、タイムスタンプなど、せいぜい数百バイト) - ファイル内容が装置上のどこに保存されているかの補助情報(可変サイズ) のように、情報はいくつかに分割されて記憶装置上の別々の個所に登録されます。 「ファイル自体の情報」はアクセスする際には必ずチェックされるし固定サイズなので、ここのアクセス時間はファイルの大きさに関係ありません。 追記するにはファイルの末尾がどこにあるかを知る必要があるので、補助情報を追っかけていく必要があります。なのでオープン直後(ないしは `seek` 時)にファイル補助情報の大きさにほぼ比例した時間を要するでしょう。書き込むだけで読み込まないのならファイル本体部分にアクセスする必要はないので(最後のクラスタを除く)追記自体にかかる時間は違わないでしょう。 OS がどうファイルシステムを実装しているかは、普通のプログラマはあまり気にしなくてよいと思います。それでも知りたいのなら、ファイルシステムの解説を読むのが良いでしょう( OS のソース読むより理解しやすいだろう)。 組み込み系だと SD/MMC カードをマイコンのソフトで自前で読み書きするとかの案件もある(=ファイルシステムの細かいところまで自前実装する)んですが、まあ例外っすよね。 オイラ何回も書いてますが、アルゴリズムやデータ構造やファイルシステムやその他の - 長所短所は知っておく必要がある。知らないと使い分けできない。 - 普通に使う上では、詳細実装を知る必要はない。 - 詳細実装を知りたくなったら資料はたいてい公開されているので探してみよう。