Самый быстрый путь в C# для нахождения файла в каталоге с более чем 20 000 файлов

salary = 1000
interest = 0.002 * salary
x = 0
sum_of_yes=0
while x < 12:
    yes = 0.15 * salary
    salary += interest
    x += 1
    sum_of_yes+=yes

print sum_of_yes
18
задан adeel825 3 April 2009 в 14:21
поделиться

5 ответов

Вместо того, чтобы делать GetFiles и сделать поиск грубой силы, Вы могли, скорее всего, использовать GetDirectories, сначала чтобы получить список "Первой sub папки", цикл через те каталоги, затем повторить процесс для sub папки, цикличное выполнение через них, наконец искать xml папку и наконец поиск .xml файлы.

Теперь, что касается производительности скорость этого будет варьироваться, но поиск каталогов сначала, ЗАТЕМ добираясь до файлов должен помочь много!

Обновление

Хорошо, я внес свою лепту тестирования, и можно на самом деле оптимизировать его гораздо дальше, чем я думал.

Следующий фрагмент кода будет искать структуру каталогов и находить ВСЕ "xml" папки во всем дереве каталогов.

string startPath = @"C:\Testing\Testing\bin\Debug";
string[] oDirectories = Directory.GetDirectories(startPath, "xml", SearchOption.AllDirectories);
Console.WriteLine(oDirectories.Length.ToString());
foreach (string oCurrent in oDirectories)
    Console.WriteLine(oCurrent);
Console.ReadLine();

Если Вы бросите это в тестовое консольное приложение, то Вы будете видеть, что он производит результаты.

Теперь, после того как у Вас есть это, просто посмотрите в каждом из найденных каталогов для Вас .xml файлы.

16
ответ дан 30 November 2019 в 08:33
поделиться

Есть ли дополнительные каталоги на том же уровне как xml папка? Если так, Вы могли, вероятно, ускорить поиск, если Вы делаете это сами и устраняете тот уровень из поиска.

        System.IO.DirectoryInfo root = new System.IO.DirectoryInfo(rootPath);
        List<System.IO.FileInfo> xmlFiles=new List<System.IO.FileInfo>();

        foreach (System.IO.DirectoryInfo subDir1 in root.GetDirectories())
        {
            foreach (System.IO.DirectoryInfo subDir2 in subDir1.GetDirectories())
            {
                System.IO.DirectoryInfo xmlDir = new System.IO.DirectoryInfo(System.IO.Path.Combine(subDir2.FullName, "xml"));

                if (xmlDir.Exists)
                {
                    xmlFiles.AddRange(xmlDir.GetFiles("*.xml"));
                }
            }
        }
3
ответ дан 30 November 2019 в 08:33
поделиться

Я ни о чем не могу думать быстрее в C#, но у Вас есть индексация включенной для той файловой системы?

0
ответ дан 30 November 2019 в 08:33
поделиться

Только путь I видит, что это имело бы много значения, должен измениться от грубого поиска на силу и использовать некоторое третье лицо или стандартную программу индексации ОС для ускорения возврата. тем путем поиск сделан от строки из Вашего приложения.

Но я также предложил бы, чтобы Вы посмотрели на лучшие способы структурировать те данные если вообще возможный.

0
ответ дан 30 November 2019 в 08:33
поделиться

Используйте P/Invoke на FindFirstFile/FindNextFile/FindClose и избегайте наверху создания большого количества экземпляров FileInfo.

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

0
ответ дан 30 November 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: