Quali sono i migliori algoritmi disponibili per recuperare i dati da un file system?

3

Questo è il mio caso d'uso:

Attraversa un filesystem, calcola l'intera dimensione e caricala su Dropbox.

Sembra abbastanza facile ed è abbastanza facile. Ora se lo faccio usando il sedano e spawn un thread per ogni cartella (con i file secondari), allora diventa un processo più facile per raccogliere tutti i dati e misurare la dimensione e quindi caricarlo su dropbox.

Ma sento che sto facendo qualcosa di sbagliato qui. Se lo implemento su un server, sicuramente lo sto sovraccaricando creando un thread per ogni cartella che si trova là fuori. Quindi, quali algoritmi dovrei usare per rendere questo un processo più veloce? Sia come recupero di dati che come caricamento di dati. Link / riferimenti sarebbero d'aiuto.

    
posta IamH1kc 02.03.2013 - 03:18
fonte

1 risposta

6

La versione breve: in assenza di circostanze insolite, dovresti usare una traversata a thread singolo. Come dice @CodesInChaos, è probabile che il tuo computer sia legato all'I / O in entrambe le fasi dell'attività: controllo delle dimensioni e caricamento allo stesso modo.

Provare a generare un thread per directory è una ricetta per bombardare a forcella la tua macchina nel dimenticatoio. Più precisamente, non ha senso invocare più thread di quanto sia necessario per saturare i colli di bottiglia delle prestazioni. Nota che ci sono 2 colli di bottiglia probabili: le prestazioni del tuo filesystem e le prestazioni del tuo collegamento di rete a Dropbox.

Per caricare i dati su Dropbox, la tua rete è quasi certamente il collo di bottiglia. Dovresti essere in grado di saturare qualsiasi collegamento a banda larga con un attraversamento a thread singolo.

Per trovare la dimensione del filesystem, il collo di bottiglia sarà anche I / O, ma i dettagli dipendono dal filesystem attuale. Per un'unità a stato solido, probabilmente non trarrai vantaggio da più di un singolo thread. Sospetto che si possa ottenere un modesto vantaggio da un numero limitato di thread in un file system a disco singolo, in quanto il sistema operativo può potenzialmente pianificare gli arresti di testa in modo un po 'più efficiente se ha una coda. La domanda è: un piccolo margine di prestazioni vale il costo di implementare e mantenere un'implementazione più complessa? (Ad esempio, gestire casi come più collegamenti fisici può essere abbastanza difficile con un'implementazione a thread singolo ...)

Un filesystem distribuito può trarre grandi benefici da una traversata multithread. Tuttavia, i dettagli su come estrarre le migliori prestazioni dipendono probabilmente dal sistema specifico.

    
risposta data 04.03.2013 - 23:39
fonte

Leggi altre domande sui tag