Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173

Многопоточная обработка мелких файлов

24.06.2014, 21:42. Показов 3757. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Программа через ThreadPool обрабатывает массив файлов:

C#
1
2
3
4
   foreach (string file in Files)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(Check), (object)file);
                }
Метод Check() читает файл, делает различные проверки, в конце - пишет результаты в таблицу.

Я заметил, что если программа обрабатывает крупные файлы (средним объемом 50 Мб), то скорость работы получается максимально высокой. Если программа обрабатывает мелкие файлы (по 1 Мб), то скорость обработки падает в несколько раз.

Как считаете, можно ли как-то ускорить обработку мелких файлов, не меняя коренным образом программу?

Добавлено через 1 минуту
Я так понял, что основные затраты состоят в том, что:
- на каждый файл создается отдельный поток;
- в методе check() ведется некая подготовка для чтения файла
- вывод результатов в DataGridView происходит чаще, если если обрабатывать крупные файлы.

Добавлено через 38 минут
В Parallel.ForEach есть такая штука встроенная "Partitioner". Она позволяет не создавать отдельный поток для каждого файла, а создавать один поток, а потом направлять в него некую "порцию" файлов. Таким образом, более эффективно распределяя нагрузку. Я, вот, думаю, можно ли для ThreadPool что-то подобное сделать.

Добавлено через 7 минут
Думаю, как бы в качестве объекта в строку
ThreadPool.QueueUserWorkItem(new WaitCallback(Check), (object)file);

передавать не один (object)file, а, скажем массив, состоящий из нескольких файлов общим объемом не менее 50 Мб. Если же какой-то файл сразу больше 50 Мб, то передавать только один файл в массиве.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.06.2014, 21:42
Ответы с готовыми решениями:

Многопоточная обработка
Здравствуйте! Есть while, который берет записи из базы данных и обрабатывает их с помощью методов класса, а затем результат записывает...

Многопоточная обработка данных + ввод/вывод
Доброго времени суток! Пишу небольшое консольное приложение, и у меня возникли некоторые вопросы. Надеюсь, кто-нибудь мне поможет. ...

Скачивание множества мелких файлов
Почему webClient.DownloadFileAsync на скачивает файлы и программа переходит к следующему методу? Хотя с webClient.DownloadFile все...

29
9 / 9 / 5
Регистрация: 23.06.2014
Сообщений: 40
25.06.2014, 13:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Psilon Посмотреть сообщение
тред пул не создает по потоку на задачу, на то он и тредпул
Если я правильно помню, то тред пул создает поток на задачу, если задачи накидываются быстрее, чем длится обработка самой задачи в потоке. А тут явно запрашивается обработка быстрее, чем выполняется.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
25.06.2014, 13:48
Костылей куча, на 2.0 давненько ничего не делал, но общий смысл должен быть понятен.
Сделано с расчётом на возможность остановки как раз. Все Ваши обработки файлов в метод DoLongRunningJob надо положить. В него передаётся экземпляр класса Job, который содержит в себе как раз List<T>. Деление на списки происходит в методе DoWork, а первоначальный список методом PrepareData() формируется.
Вложения
Тип файла: rar Threads.rar (9.9 Кб, 6 просмотров)
1
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
25.06.2014, 19:11  [ТС]
Спасибо, попробую.

Добавлено через 2 часа 40 минут
Цитата Сообщение от CarlosCastaneda Посмотреть сообщение
Если я правильно помню, то тред пул создает поток на задачу, если задачи накидываются быстрее, чем длится обработка самой задачи в потоке. А тут явно запрашивается обработка быстрее, чем выполняется.
Насколько я понял, все задачи накидываются моментально, если специально паузы в тредпуле не ставить.

Добавлено через 2 часа 7 минут
Spawn, в Вашем коде получается, что сообщение "Конец работы" появляется до того, как закончатся запущенные процессы.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
25.06.2014, 22:29
Suppir, на работе буду, гляну, возможно ошибся где-то
0
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
26.06.2014, 09:21  [ТС]
Еще не совсем понял, зачем нужен этот кусок кода:

C#
1
2
                Job.AllJobsFinished -= Job_AllJobsFinished;
                Job.AllJobsFinished += Job_AllJobsFinished;
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
26.06.2014, 09:33
Да, накосячил немного вчера, прошу прощения.
Изменённый метод DoLongRunningJob:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private void DoLongRunningJob(object state)
        {
            Job data = (Job)state;
            SetText("Начало работы №" + data.Number);
            if (needStop)
            {
                data.Stop();
                return;
            }
            Thread.Sleep(random.Next(500, 700));
            SetText("Конец работы №" + data.Number);
            data.Stop();
        }
Тут только в конце data.Stop и SetText местами поменялись.
Изменённый обработчик Job_AllJobsFinished:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        void Job_AllJobsFinished(object sender, EventArgs e)
        {
            sw.Stop();
            if (this.btnStart.InvokeRequired)
                this.btnStart.Invoke(new MethodInvoker(delegate() { Job_AllJobsFinished(sender, e); }));
            else
            {
                SetText("Конец работы.");
                btnStart.Enabled = true;
                btnStart.Text = "Запуск";
                started = false;
            }
        }
Цитата Сообщение от Suppir Посмотреть сообщение
C#
1
2
Job.AllJobsFinished -= Job_AllJobsFinished;
* * * * * * * * Job.AllJobsFinished += Job_AllJobsFinished;
Каждый раз при запуске переподписываюсь на это статическое событие. Фактически это можно и один раз сделать, только вот не проверишь (нормальным способом), а подписан ли, не флаг же заводить, но на статику подписываться всегда чревато кучей неприятностей, коли мы все склерозу подвержены
1
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
26.06.2014, 10:03  [ТС]
Исправил код, как Вы написали, но что-то все равно "конец работы" впереди всех отображается. Да еще два раза.

0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
26.06.2014, 10:09
Видимо уже сам запутался, что поправил... пост писал уж после изменений.
Проверил, вроде теперь всё как задумывалось.
Вложения
Тип файла: rar Threads.rar (9.9 Кб, 5 просмотров)
1
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
26.06.2014, 10:10  [ТС]
Спасибо, я попробую перенести код на свою задачу, потом отпишусь.
0
2 / 2 / 1
Регистрация: 16.04.2013
Сообщений: 7
27.10.2014, 02:56
Suppir,
Можешь скинуть код обработки текстовых файлов? Сам похожую задачу делаю на данный момент.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2014, 02:56

Многопоточная обработка списка
Друзья, подскажите, пожалуйста, правильно ли я делаю. Задача: Я реализовал это следующим образом: Проблема в том, что...

Многопоточная обработка массива
В общем, есть два задания: 1. Реализуйте последовательную обработку элементов вектора, например, умножение элементов вектора на число....

Многопоточная обработка структур
Прошу сильно не ругать. Нужна помощь со студенческим заданием. Задание такое: В работе необходимо реализовать многопоточную обработку ...

Многопоточная обработка файла
Всем доброго времени суток! У меня есть задача параллельной обработки файла некоторым алгоритмом. Решил это дело организовать по...

c# многопоточная обработка транзакций
Мне нужно максимально быстро обработать некоторое кол-во транзакций (от 1 до нескольких тысяч). Функция для обработки уже есть. Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru