ローカルAIのファイル監視では、エディターが監視側でパス、識別情報、キュー、完了状態を関連付けるよりも速くファイルを保存して名前変更すると、短時間に発生する保存・名前変更イベントを取りこぼすことがあります。
ローカルインデクサーはドキュメントを継続的に監視しているように見えても、多くのエディターはそのドキュメントを直接上書きしません。一時ファイルを書き込み、フラッシュしてから元のファイルの名前を変更し、置き換え用ファイルを最終パスへ移動します。ほかのアプリケーションでは、ファイルを閉じる前に複数回の書き込みをストリーミングすることもあります。OSはこれらを、低レベルの作成、変更、移動、削除、閉じるといったイベントとして報告しますが、高負荷時には重複、順序変更、統合、欠落が発生することがあります。
多くのエディターは元のファイルを置き換えて保存する
アトミック保存の方式では、完全な一時ファイルを書き込んでから、保存先のファイルに上書きする形で名前を変更します。これにより、最終ファイルが途中までしか書き込まれていない状態になるのを防ぎます。
fsnotifyの利用者は、アトミック保存が、通常の1回の書き込みではなく、作成と名前変更の操作として現れる場合があることを報告しています。
そのため、変更イベントだけを監視するウォッチャーは、論理的な保存を見逃す可能性があります。最終パス名は同じでも、その背後にあるファイルシステムオブジェクトは新しいものになっている可能性があります。
1つのファイルだけを監視すると、置き換え後のオブジェクトを見失うことがある
低レベルのウォッチャーは、ファイルの識別情報やinodeに紐付けられることがあります。そのオブジェクトが移動または削除されても、元のパス名で新しく作成されたファイルへ監視が自動的に引き継がれるとは限りません。
inotifyインターフェースは移動イベントを個別に報告し、監視対象のオブジェクト自体が削除または移動されると、監視を解除することがあります。
置き換え保存のパターンでは、親ディレクトリを監視するほうが一般的に堅牢です。古いオブジェクトが出ていくことと、新しいオブジェクトが到着することの両方を検知できるためです。
ただし、アプリケーション側で両方のイベントを論理的なドキュメントパスに関連付ける必要があります。
プラットフォームによって公開されるイベントの形は異なる
名前変更は、送信元と宛先を含む1つの移動イベントとして届くこともあれば、移動元と移動先に分かれたイベント、または削除と作成の組み合わせとして届くこともあります。
Watchdogは、作成、変更、削除、移動を対象とする個別のファイルシステムイベントを定義しており、移動したファイルの宛先パスも含みます。
すべてのシグナルを「変更」に正規化するクロスプラットフォームのウォッチャーでは、一時パスと最終パスを結び付けるために必要な情報が失われる可能性があります。
また、合成イベントでは、ライブラリがOSから正確な1つのイベントを受け取るのではなく、低レベルの通知からより高レベルの変更を推測する場合があります。
短時間に集中するイベントバーストは、キューをあふれさせたり処理側を追い越したりする
1回の保存で複数の通知が発生することがあり、同期ジョブや一括名前変更では、短時間に数千件のイベントが作成されることもあります。抽出処理をイベント処理の中で直接実行すると、読み取り側がブロックされる可能性があります。
KomuraSoftは、イベントが消費される速度を上回って集中すると、バッファーオーバーフローによって個々の変更が失われる可能性があると説明しています。
負荷の大きいOCR、解析、ハッシュ計算、埋め込み処理は別のキューへ移してください。ウォッチャーのコールバックではパスを記録し、すぐに戻るようにします。
オーバーフローのシグナルが発生した場合は、1ファイルだけに影響したと考えるのではなく、照合処理を開始する必要があります。
保存イベントは、ファイルの完成前に届くことがある
アプリケーションによっては、ファイルを作成した後もチャンク単位で書き込みを続けます。すぐにインデックスを作成すると、不完全なドキュメントを読み込み、その未完成版を最新状態として記録してしまう可能性があります。
Chokidarの安定性しきい値は、ファイルサイズが設定した期間変化しなくなるまで、追加イベントや変更イベントを遅延させます。
この遅延により応答性は低下しますが、書き込みが完了している可能性は高まります。ローカルSSDに適したしきい値でも、SMB経由で大きなファイルをコピーする場合には短すぎることがあります。
ファイルサイズが安定しただけでは、名前変更の一連の処理やメタデータの更新が完了したことまでは保証できません。
デバウンスによって別々の保存が統合されたり、最後の名前変更が隠れたりする
デバウンス処理は、一定時間内のイベントをまとめることで重複処理を減らします。しかし、短時間に行われた保存、名前変更、2回目の保存が、1つの曖昧な通知にまとめられる可能性があります。
Chokidarの概要では、不完全な書き込みに対する遅延イベント発行と、ファイルが安定したと判断するための時間制御について説明しています。
グローバルに1つのタイマーを使うのではなく、パスごとの状態を管理してください。名前変更イベントから最終的な宛先を保持し、静止期間の後に最後に観測したバージョンを処理します。
監視通知は真実を定義するのではなく、照合処理を開始するために使う
堅牢なインデクサーは、イベントを検査対象を絞り込むためのヒントとして扱います。インデックスを更新する前に、ディレクトリの内容、ファイルの識別情報、更新時刻、サイズ、コンテンツハッシュを確認します。
ZimaSpaceのバックグラウンドインデクサーに関するガイドでは、変更検知が、より広範なスキャン、抽出、データベース処理のワークフローにつながることを示しています。
定期的な再スキャンまたはジャーナルのチェックポイントを設け、通知の欠落が恒久的なインデックスのずれにならないようにします。重複イベントは通常発生するため、キュー処理はべき等にしてください。
ウォッチャーが信頼できるのは、すべての低レベルイベントが厳密に1回ずつ配信されるからではありません。バーストや置き換えが発生した後に、インデックスの状態がファイルシステムの状態へ収束するからです。
よくある質問
ローカルインデクサーはファイルとディレクトリのどちらを監視すべきですか?
エディターによる置き換え保存のパターンでは、通常、ディレクトリを監視するほうが安全です。元のファイルが出ていくことと、対象パスに新しいファイルが到着することの両方を確認できるためです。
イベントバッファーを大きくすれば、すべての更新の取りこぼしを防げますか?
いいえ。オーバーフローのリスクを1つ減らすことはできますが、アトミックな置き換え、書き込み途中のファイル、イベントの正規化、アプリケーション側のキュー障害までは解決できません。
ポーリングでファイルシステム通知を置き換えられますか?
ポーリングは照合処理を補完でき、信頼性の低いマウントでも機能しますが、スキャンの遅延とI/Oが増加します。多くのシステムでは、通知と定期的な検証を組み合わせています。
テック&AIハブ
もっと読む

季節による生活習慣の変化後、スマートホームの予測精度が低下するのはなぜですか?
季節ごとの習慣によって、時間、センサー、在室状況、望ましいアクションの関係が変化するため、以前の習慣で訓練したモデルは陳腐化します。

物体追跡を有効にすると、なぜホームNVRは短時間の出来事を見逃すのですか?
追跡には軌跡を開始して確認するために十分な検出回数が必要なため、物体が短時間で消えると、NVRが有効なイベントを作成する前に見失われることがあります。

モデルのアップグレード後にAI写真ラベルが変わるのはなぜですか?
モデルのアップグレードにより、ラベルの割り当てに使用される表現とランキングが変わるため、同じ写真でも異なる意味的境界や信頼度の境界を越えることがあります。

