Извлечение файлов из каталога, содержащего большое количество файлов

У меня есть каталог, который содержит почти 14 000 000 образцов аудио в формате * .wav.

Все простое хранилище, никаких подкаталогов.

Я хочу перебирать файлы, но когда я использую DirectoryInfo.GetFiles() в этой папке, все приложение зависает в течение нескольких минут!

Можно ли это сделать другим путем? Возможно, прочитайте 1000, обработайте их, затем возьмите следующие 1000 и так далее?

Вы пробовали метод EnumerateFiles classа DirectoryInfo?

Как говорит MSDN

Методы EnumerateFiles и GetFiles различаются следующим образом: когда вы используете EnumerateFiles , вы можете начать перечисление коллекции объектов FileInfo до возвращения всей коллекции; когда вы используете GetFiles , вы должны дождаться возврата всего массива объектов FileInfo до того, как вы сможете получить доступ к массиву. Поэтому, когда вы работаете со многими файлами и каталогами, EnumerateFiles может быть более эффективным.

В .NET 4.0 Directory.EnumerateFiles(...) является IEnumerable (а не string[] Directory.GetFiles(...) ), поэтому он может передавать записи, а не буферизировать их все; т.е.

 foreach(var file in Directory.EnumerateFiles(path)) { // ... } 

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

Один из способов решить это – создать подкаталоги и разбить ваши файлы на группы. Если каждый каталог имеет 1000-5000 (угадывание, но вы можете поэкспериментировать с реальными числами), вы должны получить приличную производительность при открытии / создании / удалении файлов.

Вот почему, если вы посмотрите на такие приложения, как Doxygen, который создает файл для каждого classа, они следуют этой схеме и помещают все в 2 уровня подкаталогов, которые используют случайные имена.

Используйте функции Win32 Api FindFile, чтобы сделать это, не блокируя приложение.

Вы также можете вызвать Directory.GetFiles в System.Threading.Task (TPL), чтобы предотвратить зависание вашего пользовательского интерфейса.

Наслаждаться.

  public List LoadPathToAllFiles(string pathToFolder, int numberOfFilesToReturn) { var DirInfo = new DirectoryInfo(pathToFolder); var firstFiles = DirInfo.EnumerateFiles().Take(numberOfFilesToReturn).ToList(); return firstFiles.Select(l => l.FullName).ToList(); } 

Я часто сталкивался с этой проблемой при обращении к большим файлам в одном каталоге. Подкаталоги – хороший вариант, но вскоре даже иногда они не предлагают много помощи. Теперь я создаю файл индекса – текстовый файл с именами всех файлов в каталоге (при создании файлов в этом каталоге). Затем я читаю индексный файл, а затем открываю фактический файл из каталога для обработки

  • Лучший способ перечислить файлы на Java, отсортированные по дате Модифицированные?
  • Чтение UTF-8 - маркер спецификации
  • перетащить файлы в стандартный файл html-файла
  • Android-файл для сохранения на внешнем хранилище
  • Как получить список файлов в каталоге на C ++?
  • Ежедневный журнал Laravel, созданный с неправильными разрешениями
  • Как сортировать очень большие файлы
  • Как переименовать с префиксом / суффикс?
  • Очистить кеш файлов для повторного тестирования производительности
  • Использование fseek с указателем файла, указывающим на stdin
  • Как получить список файлов в каталоге с помощью C или C ++?
  • Давайте будем гением компьютера.