Я создаю консольное приложение, которое должно обрабатывать кучу данных.
В основном приложение захватывает ссылки из БД. Для каждой ссылки проанализируйте содержимое файла и внесите некоторые изменения. Файлы представляют собой файлы HTML, и этот процесс делает тяжелую работу с заменами RegEx (найти ссылки и преобразовать их в ссылки). Результаты затем сохраняются в файловой системе и отправляются во внешнюю систему.
Если я возобновляю процесс, следующим образом:
var refs = GetReferencesFromDB(); // ~5000 Datarow returned
foreach(var ref in refs)
{
var filePath = GetFilePath(ref); // This method looks up in a previously loaded file list
var html = File.ReadAllText(filePath); // Read html locally, or from a network drive
var convertedHtml = ParseHtml(html);
File.WriteAllText(destinationFilePath); // Copy the result locally, or a network drive
SendToWs(ref, convertedHtml);
}
Моя программа работает правильно, но довольно медленная. Поэтому я хочу распараллелить процесс.
В настоящее время я сделал простую параллелизацию, добавив AsParallel:
var refs = GetReferencesFromDB().AsParallel();
refs.ForAll(ref=>
{
var filePath = GetFilePath(ref);
var html = File.ReadAllText(filePath);
var convertedHtml = ParseHtml(html);
File.WriteAllText(destinationFilePath);
SendToWs(ref, convertedHtml);
});
Это простое изменение уменьшает длительность процесса (на 25% меньше времени). Тем не менее, я понимаю, что с распараллеливанием заключается в том, что при параллельном доступе к ресурсам, основанным на I/O, не будет много преимуществ (или, что еще хуже, меньше преимуществ), потому что входы/выходы не будут магически удваиваться.
Вот почему я думаю, что должен изменить свой подход, чтобы не распараллелить весь процесс, а создать зависимые связанные задачи с цепочкой.
I.E., я должен создать поток вроде:
Файл чтения в очередь. Когда закончите, Queue ParseHtml. По завершении очереди Очередь отправляется на WS и записывается локально. Когда закончите, запишите результат.
Однако я не знаю, как реализовать такой взгляд.
Я чувствую, что это закончится набором очередей потребителей/производителей, но я не нашел правильный образец.
И более того, я не уверен, что будут преимущества.
спасибо за советы
[Edit] На самом деле, я идеальный кандидат на использование С# 4.5... если только это было rtm:)
[Edit 2] Еще одна вещь, которая заставляет меня думать, что она неправильно распараллеливается, заключается в том, что в мониторе ресурсов я вижу графики нестабильной работы CPU, сетевого ввода-вывода и ввода-вывода. когда человек высок, другие - от низкого до среднего