Многопоточная обработка мелких файлов - C#
Формулировка задачи:
Добрый день!
Программа через ThreadPool обрабатывает массив файлов:
Метод Check() читает файл, делает различные проверки, в конце - пишет результаты в таблицу.
Я заметил, что если программа обрабатывает крупные файлы (средним объемом 50 Мб), то скорость работы получается максимально высокой. Если программа обрабатывает мелкие файлы (по 1 Мб), то скорость обработки падает в несколько раз.
Как считаете, можно ли как-то ускорить обработку мелких файлов, не меняя коренным образом программу?
foreach (string file in Files) { ThreadPool.QueueUserWorkItem(new WaitCallback(Check), (object)file); }
Я так понял, что основные затраты состоят в том, что:
- на каждый файл создается отдельный поток;
- в методе check() ведется некая подготовка для чтения файла
- вывод результатов в DataGridView происходит чаще, если если обрабатывать крупные файлы.
В Parallel.ForEach есть такая штука встроенная "Partitioner". Она позволяет не создавать отдельный поток для каждого файла, а создавать один поток, а потом направлять в него некую "порцию" файлов. Таким образом, более эффективно распределяя нагрузку. Я, вот, думаю, можно ли для ThreadPool что-то подобное сделать.
Думаю, как бы в качестве объекта в строку
ThreadPool.QueueUserWorkItem(new WaitCallback(Check), (object)file);
передавать не один (object)file, а, скажем массив, состоящий из нескольких файлов общим объемом не менее 50 Мб. Если же какой-то файл сразу больше 50 Мб, то передавать только один файл в массиве.
Решение задачи: «Многопоточная обработка мелких файлов»
textual
Листинг программы
ThreadPool.QueueUserWorkItem(new WaitCallback(Check), (object)sb); Thread.Sleep(10);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д