2012-06-26 12 views
7

Sto provando a calcolare le dimensioni delle directory in un modo che divide il carico in modo che l'utente possa vedere il progresso del conteggio. Ho pensato che un modo logico per farlo sarebbe quello di creare prima l'albero delle directory, quindi fare un'operazione contando la lunghezza di tutti i file.Calcolo dimensioni directory

La cosa che mi viene tanto inaspettato è che la maggior parte del tempo (disco I/O) proviene da creare la struttura di directory, quindi andare oltre il FileInfo[] viene quasi istantaneamente con pochissimo disco I/O.

Ho provato sia con Directory.GetDirectories(), semplicemente creando un albero di stringhe dei nomi delle directory, e utilizzando un oggetto DirectoryInfo, ed entrambi i metodi ancora prendere la maggior parte del tempo di I/O (lettura della MFT, ovviamente) rispetto per esaminare tutto il FileInfo.Length per i file in ogni directory.

Suppongo che non ci sia modo di ridurre l'I/O per rendere l'albero significativo, suppongo che mi stia chiedendo perché questa operazione richiede molto più tempo rispetto a passare i file più numerosi?

Inoltre, se qualcuno può consigliare un modo non ricorsivo per calcolare le cose (poiché sembra che sia necessario suddividere l'enumerazione e bilanciarla al fine di rendere la dimensione più più reattiva). Fare un thread per ogni sottodirectory fuori dalla base e lasciare che la competizione del programma di pianificazione equilibri le cose non sarebbe probabilmente molto buona, vero?

EDIT: Repository for this code

+0

Ho anche faticato con il calcolo della dimensione della directory. Ho fatto esattamente quello che hai fatto. Provato> fileInfo [] e poi> Directory.GetDirectories(). Ma ancora non conosco un modo migliore. –

+0

Stai dicendo che chiamare GetDirectories() richiede molto tempo? Non l'ho visto ma, ripeto, non l'ho mai fatto con una grande quantità di directory. Inoltre, perché ti interessa se è ricorsivo? Questo è un compito ricorsivo e non avrai mai così tante directory annidate da far esplodere lo stack. –

+0

consulta http://stackoverflow.com/questions/468119/whats-the-best-way-to-calculate-the-size-of-a-directory-in-net –

risposta

4

Si può utilizzare Parallel.ForEach per eseguire il calcolo della dimensione directory in modo parallelo. È possibile ottenere GetDirectories ed eseguire Parallel.ForEach su ciascun nodo. È possibile utilizzare una variabile per tenere traccia delle dimensioni e visualizzarle all'utente. Ogni calcolo parallelo si incrementerebbe sulla stessa variabile. Se necessario, utilizzare lock() per sincronizzare le esecuzioni parallele.

+0

Dovresti codificarlo in modo che solo le directory non correlate siano parallelizzate e non ci sarà alcun motivo per bloccare oltre.Sebbene con la maggior parte dei dischi non sono sicuro di quale parallelizzazione ti possa guadagnare. Le IO del disco sembrano di natura sincrona. Tutto ciò che puoi davvero fare in parallelo è l'effettiva aggiunta di totali che dovrebbero essere trascurabili –

+2

Potresti ottenere IO in parallelo con SSD ... –

+0

@JasonMalinowski Davvero ... Non ne avevo idea. La maggior parte dei sistemi operativi sa come trarne vantaggio? Sapevo che era molto più veloce a causa della mancanza di parti in movimento, non avevo idea che fosse abilitato anche in parallelo. –