Ищете эффективный способ проверки существования файлов в Windows с файлами в сети хранения данных - PullRequest
2 голосов
/ 20 марта 2012

У меня есть большой набор файлов, расположенных в ряде каталогов на сервере Windows 2003. В каждом каталоге содержится более миллиона файлов. Сервер Windows использует iSCSI для подключения к SAN Equalogics.

У меня есть приложение, которое должно определить, существует ли набор файлов, - приложению необходимо проверить наличие до миллиона файлов в каталоге.

Я пробовал различные методы / языки сценариев, включая perl, vbscript, пакетные файлы dos, и я не могу получить более 250 проверок файлов в секунду. Это работает почти за 50 минут, чтобы проверить 800 000 файлов. Я пытался использовать многопоточность perl-программы для проверки нескольких файлов одновременно, но это не помогло.

Я также попытался перечислить все файлы в каталоге, используя dir, ls, find (через cygwin), и у него уходит много минут, чтобы он начал выводить любые имена файлов вообще. В любом случае, это не очень хороший подход, потому что файлов больше, чем мне нужно проверять.

Есть ли способ заставить Windows выполнить «чтение вперед» в каталоге и получить файлы в кэш?

Есть ли лучший способ приблизиться к этому нахождению проблемы?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2012

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

Хотя получение полного списка каталогов кажется излишним, этовероятно, будет самым быстрым методом, если ваш список поиска не будет на намного меньше (скажем, в 100 раз), чем полный каталог.

0 голосов
/ 25 апреля 2012

Каждая отдельная проверка требует, чтобы операционная система прочитала каталог, пока не найдет (или не сможет найти) файл, который вы запрашиваете.Другими словами, каждая проверка считывает в среднем более половины содержимого каталога, поэтому однократное чтение всего каталога почти наверняка будет гораздо более эффективным.

Однако вы не должны делать это, порождаяв другую программу.Используйте FindFirstFile / FindNextFile или эквивалент .NET.Вы можете проверять каждый файл по списку в том виде, в каком вы его нашли - вы можете сначала организовать свой список, поместить его в b-дерево или что-то в этом роде.

Возможно, вы захотите попробовать GetFileInformationByHandleEx с параметром FileIdBothDirectoryInfo вместоFindFirstFile / FindNextFile, чтобы увидеть, что быстрее.

0 голосов
/ 24 апреля 2012

Я бы, вероятно, избегал любого интерпретируемого языка, такого как VBScript и др., Именно по указанным вами причинам - просто не будет работать так же хорошо в сценарии, где производительность является проблемой.

Теперь, как формальное предостережение для моего предложения, я предполагаю, что в течение ожидаемого времени такое приложение будет работать, что набор подходящих файлов (цель поиска) останется относительно стабильным, так что рискложная проверка присутствия приложения из-за изменений в наборе файлов после запуска приложения сканирования минимальна.

Это не элегантно, но я бы, по крайней мере, предложил бы изучить приложение консольного типа для Win32 (не .NET), которое рекурсивно ищет дерево каталогов в отображаемом в памяти файле, а затем ищет в этом файле требуемый шаблон.Это ограничивает доступ к диску только усилиями, необходимыми для накопления результатов, а затем помещает поиск в предположительно (намного) более быстрый файл с резервной копией памяти.Возможно, я недооцениваю размер и / или сложность содержимого вашего набора файлов, но это то, что я бы предложил в качестве отправной точки.

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

Надеюсь, что это полезно, или, по крайней мере,немного мешает тебе.Удачи.

...