![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 19.09.2024
Сообщений: 5
|
![]()
На Windows 7 x64 написанная на Delphi 6 утилита читает много больших текстовых таблиц и помещает данные из них в таблицу FB Embedded 2.5 для последующего анализа. Процесс не очень быстрый, появилась идея попробовать его распараллелить. Но первый же тест привел в уныние:
Код:
Button2Click три потока по миллиону записей выполняются 2 мин 35 сек, загрузка CPU 21.5% Складывается ощущение, что все три TIBQuery трудятся в одном потоке, загружая единственное ядро. Есть какая-либо возможность заставить FB Embedded исполнять запросы разных потоков на разных физических ядрах? |
![]() |
![]() |
![]() |
#2 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,849
|
![]()
У вас во всех потоках используется одно и тоже подключение IBDatabase1. Попробуйте в каждом потоке создать свое подключение и работать с ним.
E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 19.09.2024
Сообщений: 5
|
![]()
Стало только хуже. Код
Код:
|
![]() |
![]() |
![]() |
#4 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,849
|
![]()
В качестве эксперимента попробуйте переписать код потока примерно так:
Код:
E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#5 |
Регистрация: 19.09.2024
Сообщений: 5
|
![]()
4 минуты 08 секунд и 11% процессорного времени.
Есть подозрения, что теперь уже прохлаждается даже одно ядро, а процессы стоят в очереди за доступом к файлу. |
![]() |
![]() |
![]() |
#6 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,849
|
![]()
Проблема кроется скорее всего в том, что потоки банально мешают друг другу. Ведь данные хранятся в файле. Нагрузка ЦП тут вообще не показатель, так как узким местом будет именно операции с файлами. Чуть меньше процессор стал нагружаться из-за параметрического запроса.
Можно попробовать отключить Forced Writes командой в CMD: Код:
Эффект прироста производительности может дать пакетная вставка, то есть за один запрос сразу по несколько записей: Код:
E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#7 |
Регистрация: 19.09.2024
Сообщений: 5
|
![]()
Всю однопоточную оптимизацию я давно прошел. Вплоть до EXECUTE BLOCK.
Сейсас специально сделал неоптимальный код, чтоб он максимально загружал процессор и хорошо было видно, разлеглись потоки по ядрам или нет. Вряд-ли диск - узкое место. На SSD, пусть и SATA, образовавшийся в результате добавления 3 миллионов записей 250-мегабайтный .GDB копируется в соседнюю папку за 2 секунды. Исходя из того, что однопоточный код грузит одно ядро на 100% все-таки склонен думать, что узкое место - какие-то вычисления самого FB, которые не умеют распараллеливаться. Склонен оставить задачу, как бесперспективную. Все-таки в документации написано, что FBE "Thread safe", но никто не обещал, что он "Thread optimized". Спасибо за помощь. |
![]() |
![]() |
![]() |
#8 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,849
|
![]()
Дело не в скорости диска, а в разделении ресурсов. Проще говоря, пока один из потоков производит запись данных, другие потоки вынуждены ждать. Почему я и предложил пакетный SQL, по идеи он должен ускорить работу, даже в случае однопотока за счет уменьшения количества обращений к СУБД.
E-Mail: arigato.freelance@gmail.com
|
![]() |
![]() |
![]() |
#9 |
Регистрация: 19.09.2024
Сообщений: 5
|
![]()
Пакетный SQL действительно повышает производительность. Может раза в полтора максимум. Это не тот выигрыш, который я хотел получить, заставив исполнять каждый IBQuery в отдельном потоке.
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Перебор данных из бд в несколько потоков | pro100kos | БД в Delphi | 8 | 20.01.2022 09:12 |
Поток запускает несколько потоков | bilibian | Общие вопросы Delphi | 3 | 21.08.2016 11:30 |
Логгирование, несколько потоков | pa6kevi4 | Общие вопросы .NET | 3 | 12.06.2010 22:32 |
[Вопрос] IdHttp в несколько потоков | TilerDerton | Работа с сетью в Delphi | 3 | 22.09.2009 22:14 |
Несколько потоков | Adm | Общие вопросы Delphi | 13 | 18.01.2008 20:04 |