2014-01-03 3 views
0

У меня есть структура папок на сетевом диске, которыйC# каталога производительность сканирования

Центр Бронирования -> Объект -> Файлы

например

  • EUR/12345678/File_archive1.txt
  • EUR/12345678/File_archive2.txt
  • EUR/12345678/File_latest.txt
  • EUR/5555/File_archiv e1.txt
  • EUR/5555/File_archive2.txt
  • EUR/5555/File_latest.txt

Когда пользователь выбирает центр бронирования из выпадающего списка, я хочу код, чтобы посмотреть в приведенном выше сетевой путь для этого центра бронирования, посмотреть все подпапки и найти самый последний файл в каждой из подпапок и использовать его для заполнения списка портфелей для второго раскрывающегося списка. Это невероятно медленно, хотя мой код приведен ниже. Может ли кто-нибудь предложить более быстрый подход?

public IDictionary<string, Portfolio> ReadPortfolios() 
{ 
    var portfolios = new Dictionary<string, Portfolio>(); 

    var di = new DirectoryInfo(PortfolioPath); 
    var possibleFacilities = di.GetDirectories(); 

    foreach (var possibleFacility in possibleFacilities) 
    { 
     try 
     { 
      if (possibleFacility.GetFiles().Any()) 
      { 
       var mostRecentFile = possibleFacility.GetFiles().OrderBy(file => file.LastWriteTimeUtc).Last(); 

       var portfolio = UnzipAndReadPortfolio(mostRecentFile); 
       if (portfolio == null) continue; 

       portfolios.Add(possibleFacility.Name, portfolio); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(@"Failed to read portfolio: " + ex.Message); 
     } 
    } 

    return portfolios; 
} 
+2

Возможно, вы можете выполнить «Анализ производительности» в Visual Studio, чтобы проверить, какой метод работает медленно? Если вы прокомментируете «UnzipAndReadPortfolio», это быстрее? – Odrai

+2

Вы перечисляете два раза possibleFacility.GetFiles() – schglurps

+0

Не могли бы вы предварительно вычислить и кешировать словарь результатов, а не пересчитывать его каждый раз, когда выпадающий список выбран? –

ответ

1

Если вы заинтересованы все подкаталоги «PortFolioPath», попробуйте использовать перегрузку GetDirectories и/или GetFiles, который позволяет передать параметр SearchOption.AllDirectories: это позволит избежать многократного доступа к сети.

У вас также есть ДВОЙНЫЕ вызовы GetFiles() в вашем цикле, вы должны сохранить результат первого вызова в локальной переменной.

Вы не указали код UnzipAndReadPortfolio, который, возможно, является самой медленной частью (... или нет?).

Помните: в вашем коде часто вы можете думать «один вызов метода = один доступ к сети». Поэтому постарайтесь, чтобы сгладить ваши петли, уменьшить FSO доступа и т.д.

+0

Также обратите внимание, что «.Last()» в вашем коде генерирует исключение в пустой папке, даже с нулевой проверкой. Вместо этого используйте LastOrDefault(). – AFract

1

коэффициент усиления, вероятно, реальная производительность мало

var mostRecentFile = possibleFacility.GetFiles() 
        .OrderBy(file => file.LastWriteTimeUtc) 
        .LastOrDefault(); 
if(mostRecentFile != null) 
    .... 

и закомментировать первую

// if(possibleFacility.GetFiles().Any()) 
1

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

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