Sto sviluppando un software che utilizzerà inotify per tenere traccia delle modifiche su una grande quantità di file (da decine a centinaia di migliaia di file). Mi sono venute in mente queste idee:
- un controllo per file
- un controllo per directory principale
- evitare inotify ed eseguire periodicamente la scansione di fs per le modifiche (non preferito)
Avrò un database di tutti i file che sto guardando e alcune informazioni statistiche di base (come mtime e dimensioni), tuttavia, dovrei dichiarare ogni file in quella directory finché non ho trovato quello che è cambiato.
Quale sarebbe più veloce, tonnellate (oltre 100.000) di orologi inotify o tonnellate di chiamate statistiche?
Penso che ridurre il numero di chiamate statistiche sarebbe meglio, ma non ne so abbastanza di inotify.
Nota:
Questo verrà eseguito su una workstation, non su un server. Il suo scopo principale è sincronizzare le modifiche (potenzialmente a un intero filesystem) tra un client e un server remoto.
Risposta accettata:
Quando read()
un inotify fd, il name
il campo della struttura restituita ti dice quale file è stato modificato rispetto alla directory che viene guardata, quindi non dovresti dover dichiarare ogni file in una directory dopo l'evento.
Vedi http://linux.die.net/man/7/inotify
Nello specifico:
struct inotify_event { int wd; /* Watch descriptor */ uint32_t mask; /* Mask of events */ uint32_t cookie; /* Unique cookie associating related events (for rename(2)) */ uint32_t len; /* Size of 'name' field */ char name[]; /* Optional null-terminated name */ };
Il campo del nome è presente solo quando viene restituito un evento per un file
all'interno di una directory controllata; identifica il percorso del file relativo
alla directory esaminata. Questo percorso ha terminazione null e può
includere ulteriori byte null per allineare le letture successive a un limite di indirizzo
adatto.