2010-04-30 2 views
1

У меня около 1500 файлов на общем ресурсе, для которых мне нужно собрать строку FileVersionInfo. Так что я создал статический метод в моем шлюзе так:TPL - Использование статического метода vs struct method

private static string GetVersionInfo(string filepath) 
{ 
    FileVersionInfo verInfo = FileVersionInfo.GetVersionInfo(filepath); 
    return string.Format("{0}.{1}.{2}.{3}", verInfo.ProductMajorPart, verInfo.ProductMinorPart, 
              verInfo.ProductBuildPart, verInfo.ProductPrivatePart).Trim(); 
} 

, а затем использовали FileAndVersion-структуру в PLINQ вызова с DegreeOfParallelism как это I/O связанных

resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20) 
        .Select(r => 
        { 
         var symbolPath = r.Filename; 
         return new FilenameAndVersion{Filename=symbolPath, Version=GetVersionInfo(symbolPath)}; 
        }) 
        .ToArray(); 

Позже я модифицировал Struct, FileAndVersion как:

private struct FilenameAndVersion 
{ 
    private string _version, _filename; 
    public string Version { get { return _version; } } 
    public string Filename { get { return _filename; } } 

    private void SetVersion() 
    { 
     FileVersionInfo verInfo = FileVersionInfo.GetVersionInfo(this.Filename); 
     this._version = string.Format("{0}.{1}.{2}.{3}", verInfo.ProductMajorPart, verInfo.ProductMinorPart, 

                        verInfo.ProductBuildPart, verInfo.ProductPrivatePart).Trim(); 
} 
public FilenameAndVersion(string filename, string version) 
{ 
    this._filename = filename; 
    this._version = string.Empty; 
    SetVersion(); 
} 

}

И использовали его:

resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20) 
        .Select(r => 
        { 
         var symbolPath = r.Filename; 
         return new FilenameAndVersion(symbolPath, String.Empty); 
        }) 
        .ToArray(); 

Вопрос в том, что это поможет мне в любом случае и является хорошим шаблоном для использования? Забыл упомянуть, что файлы находятся на сервере с RAID 10 с SAN, прикрепленным к нему.

Sunit

ответ

2

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

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

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

Моим советом было бы сравнить его перед тем, как вы решите сделать что-то параллельное.

+0

Файлы находятся на файловом сервере с подключенным SAN. – Sunit

+0

@Sunit: То, что я сказал, все еще может быть правдой. Ваш сетевой канал ограничен, поэтому вы можете обнаружить, что параллельный и последовательный файлы не отличаются разницей, но по-прежнему связаны скоростью сети. Единственный способ узнать - проверить или профилировать его. Я подозреваю, что это, вероятно, в значительной степени зависит от нагрузки сети/сан в то время, поэтому запустите свои тесты в часы пик и пиковые часы.Вы можете обнаружить, что вам лучше всего положить эту массу всего на один фоновый поток, который будет в основном бездействовать в ожидании сети и освободить процессор для графического интерфейса или другой работы. –

+0

Да, я уже профилировал с помощью инструментов VS2010. Похоже, что в нашем случае SAN с сетью 10RAID/1Gb занимался обработкой, давая лучший результат, используя TPL vs synch IO. Так что пока мы решили пойти по этому маршруту. – Sunit

1

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

Но, как всегда, вам необходимо профиль и фактическое измерение воздействия изменения.

Для уточнения: Выполнение дорогостоящих операций с файлами в фоне (предпочтительно с использованием портов завершения ввода/вывода, которые FileVersionInfo, к сожалению, не предлагает) является хорошей вещью, чтобы сделать, чтобы избежать блокировок пользовательского интерфейса, или ASP .NET, в зависимости от вашей среды. Это сильно отличается от их работы в параллельно, однако; TPL в первую очередь предназначен для распараллеливания задач с интенсивным использованием ЦП, где несколько ядер ЦП могут ускорить выполнение операции.

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