Я пишу программу, которая должна обрабатывать множество небольших файлов, скажем тысячи или даже миллионы. Я тестировал эту часть на 500k файлов, и первым шагом было просто перебрать каталог, в котором есть около 45k каталогов (включая подкаталоги подкаталогов и т. Д.), И 500k небольших файлов. Обход всех каталогов и файлов, включая получение размеров файлов и вычисление общего размера, занимает около 6 секунд. Теперь, если я попытаюсь открыть каждый файл во время обхода и немедленно закрыть его, похоже, что он никогда не останавливается. На самом деле, это занимает слишком много времени (часы ...). Поскольку я делаю это в Windows, я попытался открыть файлы с помощью CreateFileW, _wfopen и _wopen. Я ничего не читал и не записывал в файлы, хотя в окончательной реализации мне нужно будет только чтение. Однако я не заметил заметных улучшений ни в одной из попыток.
Интересно, есть ли более эффективный способ открывать файлы с помощью любой из доступных функций, будь то C, C ++ или Windows API, или единственный более эффективный способ - это читать MFT и читать блоки диска напрямую, что я пытаюсь избежать?
Обновление: приложение, над которым я работаю, делает снимки резервных копий с управлением версиями. Таким образом, у него также есть инкрементные резервные копии. Тест с 500 КБ файлов выполняется в огромном репозитории исходного кода для управления версиями, что-то вроде scm. Итак, все файлы не находятся в одном каталоге. Также существует около 45 тысяч каталогов (упомянутых выше).
Таким образом, предлагаемое решение для архивирования файлов не помогает, потому что, когда резервное копирование выполнено, происходит доступ ко всем файлам. Следовательно, я не увижу от этого никакой пользы и даже повлечет за собой некоторую потерю производительности.