Che cosa è un buon modo per impostare un "indice condiviso" dei metadati dei file, quando non può esserci alcun processo condiviso come un server di database?
Spiegherò lo scenario: un server contiene M (diciamo 10000) file di grandi dimensioni (ad esempio, per esempio file di immagine). ogni file si trova in una sottodirectory univoca con nome guid. La directory root è condivisa come condivisione di Windows e verrà utilizzata da diversi client (N) che eseguono un'applicazione desktop. L'applicazione desktop è in fase di implementazione, quindi può essere progettata in qualsiasi modo. Gli archivi dati si trovano su cartelle locali o su cartelle di rete condivise e possono essere impostati da ciascun client (senza amministrazione centrale), pertanto non esiste un computer centrale in grado di eseguire un database con l'indice dei metadati. Ogni cliente potrebbe aver utilizzato cartelle diverse. Per esempio
client1 uses \server1\share1\[1000 guid directories]
client2 uses \server1\share1\[1000 guid directories]
\server1\share2\[1000 guid directories]
Nello scenario precedente, i clienti potrebbero teoricamente condividere un indice archiviato nella radice \server1\share1
.
Il numero di utenti sarà relativamente basso (tipicamente < 20) quindi ci sono tutte le probabilità che avere indici condivisi sia eccessivo, e invece ogni client dovrebbe solo raschiare un file di indice locale e lavorare da quello.
Quello che voglio emulare è che il server ha un processo di scraping / caching in esecuzione e un frontend del DB che consente ai client di eseguire query sui file tramite i relativi metadati. Tuttavia, non posso avere un processo sul server.
Nell'approccio ingenuo, tutti i client N analizzeranno i file M e memorizzeranno i metadati in memoria. A seconda che siano persistenti anche su disco, il numero di volte in cui un file viene raschiato sarà NxM o NxMxK se ogni utente esegue sessioni K. Questo è ovviamente uno spreco e incorrerà in un sacco di traffico di rete senza una buona ragione. I dati vengono aggiunti (nuovi file aggiunti) piuttosto raramente, ma letti spesso. Anche le modifiche ai file esistenti sono rare. Il volume dei dati potrebbe essere compreso tra 0-10 G mentre il volume totale dei metadati è 0-10 M.
Questo è molto simile al modo in cui windows (fino a Win7 credo) cancella Thumbs.db nella cartella in cui sono state create le anteprime, anche per le cartelle condivise.
Qual è un buon approccio per mantenere un "indice condiviso" dei metadati? Esempio: dopo che un client ha raschiato tutti i file, scarica nella directory radice un file di indice. Un client che scrive sui dati potrebbe anche aggiornare immediatamente il file di indice. Il prossimo cliente potrebbe utilizzare semplicemente i metadati pre-raschiati. Ho preso in considerazione l'utilizzo di un DB di file appropriato (ad esempio SQLite) ma non sono adatti per un file condiviso utilizzato da più processi, anche se la maggior parte è letta solo.
Un altro metodo sarebbe quello di avere file SQLite locali su ciascun client, con i client semplicemente scaricando la loro copia nella directory del server affinché altri possano scaricarli e utilizzarli come copia locale. Idee?