|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
||||||
Многопоточная обработка мелких файлов24.06.2014, 21:42. Показов 3561. Ответов 29
Метки нет (Все метки)
Добрый день!
Программа через ThreadPool обрабатывает массив файлов:
Я заметил, что если программа обрабатывает крупные файлы (средним объемом 50 Мб), то скорость работы получается максимально высокой. Если программа обрабатывает мелкие файлы (по 1 Мб), то скорость обработки падает в несколько раз. Как считаете, можно ли как-то ускорить обработку мелких файлов, не меняя коренным образом программу? Добавлено через 1 минуту Я так понял, что основные затраты состоят в том, что: - на каждый файл создается отдельный поток; - в методе check() ведется некая подготовка для чтения файла - вывод результатов в DataGridView происходит чаще, если если обрабатывать крупные файлы. Добавлено через 38 минут В Parallel.ForEach есть такая штука встроенная "Partitioner". Она позволяет не создавать отдельный поток для каждого файла, а создавать один поток, а потом направлять в него некую "порцию" файлов. Таким образом, более эффективно распределяя нагрузку. Я, вот, думаю, можно ли для ThreadPool что-то подобное сделать. Добавлено через 7 минут Думаю, как бы в качестве объекта в строку ThreadPool.QueueUserWorkItem(new WaitCallback(Check), (object)file); передавать не один (object)file, а, скажем массив, состоящий из нескольких файлов общим объемом не менее 50 Мб. Если же какой-то файл сразу больше 50 Мб, то передавать только один файл в массиве.
0
|
||||||
| 24.06.2014, 21:42 | |
|
Ответы с готовыми решениями:
29
Многопоточная обработка Многопоточная обработка данных + ввод/вывод Скачивание множества мелких файлов |
|
9 / 9 / 5
Регистрация: 23.06.2014
Сообщений: 40
|
|
| 24.06.2014, 21:44 | |
|
Можно, есть штука под названием Task - она как раз не создает новый поток, а использует уже существующие.
0
|
|
|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
|
| 24.06.2014, 21:47 [ТС] | |
|
Мне нужно на ThreadPool, т.к. c# 2.0 использую.
Разгадка, скорей всего в последнем абзаце сабжевого поста. То есть нужно делать файлы на массивы из "порций" по 50 Мб, а потом передавать в ThreadPool массивы.
0
|
|
|
9 / 9 / 5
Регистрация: 23.06.2014
Сообщений: 40
|
|
| 24.06.2014, 21:50 | |
|
И что? передадите 50 файлов по 1 мегабайту, или по 5000 файлов по 10 кб, получите дохера потоков,
которые будут открывать (относительно медленная операция), работать с файлами, и закрывать их(тоже относительно медленная).
0
|
|
|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
|||||||||||
| 24.06.2014, 21:56 [ТС] | |||||||||||
|
Нет. Если я не 50 раз передам по файлу в 1 Мб:
0
|
|||||||||||
|
9 / 9 / 5
Регистрация: 23.06.2014
Сообщений: 40
|
|
| 24.06.2014, 22:01 | |
|
Да, разумеется, отработает в одном потоке. Вызываете же один раз
ThreadPool.QueueUserWorkItem
0
|
|
|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
|
| 24.06.2014, 22:03 [ТС] | |
|
Значит, я на верном пути, дон Карлос.
0
|
|
|
Master of Orion
|
|
| 25.06.2014, 10:03 | |
|
Suppir, тред пул не создает по потоку на задачу, на то он и тредпул. Поэтому 4 файла по 10 кб или 4 файла по 100мб, будет работать в одно и то же число потоков. Скорее всего, падение скорости связанно со случайным доступом к данным. Вместо того, чтобы гадать, нужно запускать профайлер и смотреть.
0
|
|
|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
|||||||||||
| 25.06.2014, 10:21 [ТС] | |||||||||||
|
Я для теста проверяю 17 тыс. мелких файлов общим объемом 200 Мб.
Был такой код посылания в ThreadPool:
Сейчас переписал на такой код:
Не знаю почему, но список через файлом List<string> не получается формировать. Передается всего один файл. Поэтому формирую StringBuilder с названиями файлов, а внутри функции разделяю этот StringBuilder с помощью Split на названия файлов. Добавлено через 44 секунды Пока что код косячный, есть разные глюки, но направление, скорее всего, правильное. Добавлено через 5 минут Возможно, еще связано с тем, что перед каждой обработкой файла инициируются многие переменные, списки, регулярные выражения - это также отнимает время. Сейчас я делаю эту инициацию не перед каждым из 17000 файлов, а перед 20 "порциями" файлов по 10 Мб. То есть почти в тысячу раз реже. Инициация занимает 5 миллисекунд по тестам. Умножаем на 17 тыс. = 85 секунд простоя.
0
|
|||||||||||
|
|
|
| 25.06.2014, 10:27 | |
|
Если там нигде реально долгоиграющих действий нет, то в основном потери будут из-за железа, как и сказал Psilon, из-за случайного доступа к данным. То, что Вы делаете, в данном конкретном случае отработало 7 секунд, при других файлах, размерах, дефрагментированности диска, отработает совсем иначе.
0
|
|
|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
|
| 25.06.2014, 10:38 [ТС] | |
|
Запускаю на SSD-винчестере. Не знаю, влияет ли там дефрагментация.
Добавлено через 1 минуту Я не могу только понять, почему не удается формировать List<string> с названиями файлов. Если передаю в ThreadPool, а потом обнуляю (ведь нужно дальше заново формировать), то внутри ThreadPool при перечислении файлов пишет, что список был изменен, перечисление невозможно. Как думаете, можно ли это исправить?
0
|
|
|
Master of Orion
|
|
| 25.06.2014, 10:38 | |
|
Suppir, тогда странно.
Да и если не себе программа пишется, лучше протестировать на компьютерах с обычным hdd. Потому тут уже в обратную сторону будет работать ![]() Любая программа может работать быстро. Если работает медленно, значит что-то делается не так. Трудно так сходу сказать, что конкретно, но вот наличие этого тупика очевидно.
0
|
|
|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
||||||
| 25.06.2014, 10:46 [ТС] | ||||||
|
Может быть еще влияет, что стоит:
0
|
||||||
|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
|||||||
| 25.06.2014, 10:53 [ТС] | |||||||
|
Spawn,
Я пробовал передавать List<string> из файлов следующим образом:
Внутри RunCheck я просто перебираю список файлов. Но там получается, что этот список обнуляется извне. Скорее всего, кодом Patriotion.Clear(), который идет после ThreadPool.QueueUserWorkItem. Как думаете, можно ли это как-то исправить? Добавлено через 2 минуты
0
|
|||||||
|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
|||||||||||
| 25.06.2014, 11:04 [ТС] | |||||||||||
|
Psylon, вы знаете какой-нибудь более правильный вариант для ThreadPool?
![]() Я использую паузу после ThreadPool, потом:
0
|
|||||||||||
|
1 / 1 / 0
Регистрация: 20.06.2014
Сообщений: 17
|
||
| 25.06.2014, 13:16 | ||
|
0
|
||
|
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
|
||||||
| 25.06.2014, 13:22 [ТС] | ||||||
|
Я пробовал создать копию внутри RunCheck - примерно то же самое получается.
А как передавать копию? В смысле, присвоить значения другому списку, передать его? Но ведь другой список также придется обнулять. И если он будет в локальной видимости:
0
|
||||||
| 25.06.2014, 13:22 | |
|
Помогаю со студенческими работами здесь
20
Многопоточная обработка списка
Многопоточная обработка структур Многопоточная обработка файла c# многопоточная обработка транзакций Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|