Russian Qt Forum
Май 01, 2024, 15:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: параллельная обработка файлов  (Прочитано 19085 раз)
Bepec
Гость
« Ответ #15 : Февраль 15, 2016, 22:33 »

Уж вас ли не знать, что наличие в руках непонятной фигни, увеличиваем шансы на разбор и правильный сбор этой фигни Веселый
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #16 : Февраль 15, 2016, 23:27 »

по-моему всю необходимую информацию я предоставил: имеется хэш «строка-массив» (ну или просто массив массивов, непринципиально), необходимо поэлементно сравнить каждый массив с каждым, это сравнение я хочу распараллелить.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #17 : Февраль 16, 2016, 03:37 »

Ну я вообще то брал в расчёт все расходы - на чтение, на вычисление хеша и на сравнение.

PS я имел в виду дать данные для работы, эти 10к файлов или что там Веселый
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #18 : Февраль 16, 2016, 11:22 »

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

главный затык в перекрестном сравнении (потому что много сравнивать), а что там внутри — неважно.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #19 : Февраль 16, 2016, 14:06 »

трудно будет вычленить минимальный

тема создана не для «напишите мне», а «расскажите как правильно сделать и что почитать».
то есть хэш разрезать на n/2 частей и на каждую выделить нить, которая будет проводить 3 сравнения?
Не нужно никого резать, и хеш не нужен. Есть контейнер в котором каждый эл-т соответствует файлу (данные). Теперь формируем "задачи" которые будем скармливать ниткам (число задач не зависит от числа ниток)

Первая задача будет сравнивать первый файл со всеми остальными
Вторая задача будет сравнивать второй файл со всеми последующими + предпоследний с последним
Третья - третий файл со всеми последующими + 3 последних
и.т.д

Задаче надо знать только контейнер и 2 индекса с которых начинать
вот это буду пробовать

В случае когда 1-я задача в первом потоке будет сравнивать 1-й и 2-й файлы, а 2-я задача во втором потоке будет сравнивать 2-й и 3-й файлы, то два потока будут обращаться к одному и тому же 2-му массиву данных. Это приведет к снижению производительности.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Февраль 16, 2016, 14:53 »

В случае когда 1-я задача в первом потоке будет сравнивать 1-й и 2-й файлы, а 2-я задача во втором потоке будет сравнивать 2-й и 3-й файлы, то два потока будут обращаться к одному и тому же 2-му массиву данных. Это приведет к снижению производительности.
Читать одно и то же могут хоть все нитки сразу. Это будет даже чуть шустрее за счет кеша процессора
Записан
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #21 : Февраль 16, 2016, 15:33 »

Да, если адреса данных для 2х потоков будут совпадать. Я смотрел с другой стороны, а если за квант времени каждый поток обрабатывает по 40 байт и адреса данных перекрываются, то будет постоянная перезагрузка кэша.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Февраль 16, 2016, 15:37 »

Да, если адреса данных для 2х потоков будут совпадать. Я смотрел с другой стороны, а если за квант времени каждый поток обрабатывает по 40 байт и адреса данных перекрываются, то будет постоянная перезагрузка кэша.
При использовании QString и (я так подозреваю) "регулярки" о таких вещах говорить просто неприлично  Улыбающийся
Записан
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #23 : Февраль 16, 2016, 16:03 »

главный вопрос темы: как ускорить обработку, отсюда Q'стринги просто не применимы  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Февраль 16, 2016, 16:07 »

главный вопрос темы: как ускорить обработку, отсюда Q'стринги просто не применимы  Улыбающийся
Давайте спокойнее относиться к моде/увлечениям молодежи  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #25 : Февраль 16, 2016, 16:12 »

Да, если адреса данных для 2х потоков будут совпадать. Я смотрел с другой стороны, а если за квант времени каждый поток обрабатывает по 40 байт и адреса данных перекрываются, то будет постоянная перезагрузка кэша.
При использовании QString и (я так подозреваю) "регулярки" о таких вещах говорить просто неприлично  Улыбающийся
мимо
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #26 : Февраль 21, 2016, 11:10 »

Вспомнилась мне точно такая же история. Нужно было в строго определенное время анализировать ~40000 техпроцессов (1 тп - 1 файл). Программа была написана задолго до меня в Delphi и отрабатывала за 2,5 часа. Руководству для принятия каких-то там решений оставалось 30 минут и попросили ускорить. Переписал все в Builder 2006 и результат получал через 40 минут. Все в восторге! Но какой то гвоздь в заднице не давал покоя и в одну  из новогодних ночей переписал все на чистом "С" без шаблонов, классов, с загрузкой файлов в память и расчета смещения указателей и все на 2-х потоках. Программа обсчитала все эти файлы за полторы минуты. Я в шоке! Руководство в испуге! Попросили больше таких программ не писать) Использование привычных классов будет вас тормозить.

http://bash.im/quote/438082

 Улыбающийся
Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #27 : Февраль 21, 2016, 16:54 »

всем спасибо, все получилось. результаты (дебаг сборка без подключенного дебаггера):
  • загрузка файлов и обработка по отдельности (эту часть я не менял):
    • 1000 файлов: 17 секунд
    • 10000 файлов: 220 секунд
  • перекрестное сравнение:
    • 1000 файлов: 30 секунд => 13 секунд
    • 10000 файлов: 2850 секунд => 1420 секунд
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #28 : Февраль 23, 2016, 17:38 »

в релиз сборке студией 2015 10к файлов обрабатывается чуть менее 3-х минут Улыбающийся правда, тут машина чуть помощнее.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Февраль 24, 2016, 09:50 »

  • 1000 файлов: 30 секунд => 13 секунд
Наверное 4 ядра? Маловато КПД. Если интересно сравните с OMP, там главная забота - подключить либу, (в MSVC она есть), дальше так
Код
C++ (Qt)
#pragma omp parallel for
for (int i = 0; i < task.size(); ++i)
DoTask(task[i]);
 
Ну и воткнуть omp_set_num_threads на старте приложения
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.092 секунд. Запросов: 22.