2012-06-26 2 views
7

Я пытаюсь рассчитать размеры каталога таким образом, чтобы делить нагрузку, чтобы пользователь мог видеть прогресс подсчета. Я думал, что логичным способом сделать это было бы сначала создать дерево каталогов, а затем выполнить операцию, подсчитывая длину всех файлов.Вычисление размеров каталога

Вещь, которая приходит ко мне как неожиданная, заключается в том, что основная часть времени (дисковый ввод-вывод) происходит от создания дерева каталогов, а затем переключение на FileInfo[] происходит почти мгновенно, практически без дискового ввода-вывода.

Я попытался с Directory.GetDirectories(), просто создав дерево строк имен каталогов и используя объект DirectoryInfo, и оба метода по-прежнему занимают основную часть времени ввода-вывода (считывая MFT, конечно) по сравнению перебирать все файлы FileInfo.Length для файлов в каждом каталоге.

Я думаю, что нет возможности уменьшить ввод-вывод, чтобы значительно увеличить дерево, я думаю, мне просто интересно, почему эта операция занимает значительно больше времени по сравнению с более многочисленными файлами?

Кроме того, если кто-то может рекомендовать нерекурсивный способ подсчета очков (так как мне кажется, что мне нужно просто разбить перечисление и сбалансировать его, чтобы сделать размер с учетом более отзывчивого). Создание потока для каждой поддиректории с базы и позволяя сбалансировать баланс планировщика, вероятно, будет не очень хорошим, не так ли?

EDIT: Repository for this code

+0

Я также боролся с вычислением размера каталога. Я сделал именно то, что вы сделали. Tried> fileInfo [], а затем> Directory.GetDirectories(). Но я все еще не знаю лучшего способа. –

+0

Вы говорите, что вызов GetDirectories() занимает много времени? Я этого не видел, но опять же, я никогда не делал этого с большим количеством каталогов. Кроме того, почему вас это волнует, если он рекурсивный? Это рекурсивная задача, и вы никогда не будете иметь так много вложенных каталогов, что вы взорвите стек. –

+0

обратитесь к http://stackoverflow.com/questions/468119/whats-the-best-way-to-calculate-the-size-of-a-directory-in-net –

ответ

4

Вы можете использовать Parallel.ForEach для выполнения расчета размера каталога в параллельно. Вы можете получить GetDirectories и запустить Parallel.ForEach на каждом узле. Вы можете использовать переменную, чтобы отслеживать размер и отображать ее для пользователя. Каждое параллельное вычисление будет увеличиваться на одну и ту же переменную. При необходимости используйте lock() для синхронизации между параллельными запусками.

+0

Вы должны закодировать его так, чтобы только несвязанные каталоги были распараллелены, и нет никаких причин для блокировки за его пределами.Хотя с большинством дисков я не уверен, что распараллеливает вас. Дисковые МО кажутся синхронными по своей природе. Все, что вы действительно можете сделать параллельно, - это фактическое добавление итогов, которые должны быть незначительными. –

+2

Вы можете получить параллельные IO с SSD ... –

+0

@JasonMalinowski Действительно ... Я понятия не имел. Большинство ОС знают, как воспользоваться этим? Я знал, что это было намного быстрее из-за отсутствия движущихся частей, и не думал, что он также поддерживает параллель. –

Смежные вопросы