ファイルの監視
Posted by on 23rd, 2009
効率のよい、ファイルの監視はどうすべきなのだろうか?
特定のディレクトリ配下を毎回全スキャンしても、平気なくらいのファイル数しかないが、それでも0.5秒に一回スキャンするのはちょっと・・・と思いつつ、ファイルをハッシュで管理しても、変更があったか確認するために変更時刻は比較してるしなぁ。
変更時刻を得る処理は重たいのか?
この辺は・・・カーネル関係の本が必要?
ちょっと調べたらこんな感じ。
■ファイル更新の監視 どう書く?org
http://ja.doukaku.org/15/nested/#comment461
・・・って自分で書いたのと変わらない。
これでいいのかな?
.Net FrameworkにはFileSystemWatcherなるものがあるらしい。
■FileSystemWatcher クラス (System.IO)
http://msdn.microsoft.com/ja-jp/library/system.io.filesystemwatcher(VS.80).aspx
アセンブリ: System (system.dll 内)
なんて書いてあるけど、こいつはカーネルレベルで監視!?
どっちにしても.Netは関係ないんだけど
.NetというかWindows APIでディレクトリの監視やファイルの監視ができます。
この仕様は昔からです。
あんまり良くわからないけど、UNIX系の正攻法はこれでしょう?
http://ja.doukaku.org/15/nested/#comment3698
tailの実装を参考にするのは目の付けどころが素晴らしいです。
たぶんこれに似たようなものはUNIX系でも昔からあると思います。
基本的にイベントハンドリングでパフォーマンスを追求するなら、カーネルの設計ポリシーが違う以上、環境依存になるのは仕方ないですね。
ネットワーク(ファイル)イベントの取得にしても、
select (Winsockでもサポート?)
poll (POSIXならOK?)
epoll (Linux限定?)
という感じで、イベントのハンドリングはスピードが増せば、
その分だけ環境依存になっています。
あとは必要な性能とコストとのバランスですね。
6月 23rd, 2009 at 13:17
やっぱりカーネルで監視ですよね~。
Pythonだし、Windowsでも使うことありそうなので、環境依存にしたくないなぁ~というところです。
ラップしてくれるライブラリがありそうな気がして調べたらこんなの発見。
■py-kqueue – スコトプリゴニエフスク通信
http://d.hatena.ne.jp/perezvon/20080330/1206879201
あとで読もうっと。
6月 23rd, 2009 at 13:39