|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
19.09.2024, 13:34 | #1 |
Регистрация: 19.09.2024
Сообщений: 5
|
Добавление данных в FB Embedded в несколько потоков.
На Windows 7 x64 написанная на Delphi 6 утилита читает много больших текстовых таблиц и помещает данные из них в таблицу FB Embedded 2.5 для последующего анализа. Процесс не очень быстрый, появилась идея попробовать его распараллелить. Но первый же тест привел в уныние:
Код:
Button2Click три потока по миллиону записей выполняются 2 мин 35 сек, загрузка CPU 21.5% Складывается ощущение, что все три TIBQuery трудятся в одном потоке, загружая единственное ядро. Есть какая-либо возможность заставить FB Embedded исполнять запросы разных потоков на разных физических ядрах? |
19.09.2024, 15:37 | #2 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,654
|
У вас во всех потоках используется одно и тоже подключение IBDatabase1. Попробуйте в каждом потоке создать свое подключение и работать с ним.
E-Mail: arigato.freelance@gmail.com
|
20.09.2024, 08:37 | #3 |
Регистрация: 19.09.2024
Сообщений: 5
|
Стало только хуже. Код
Код:
|
20.09.2024, 11:11 | #4 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,654
|
В качестве эксперимента попробуйте переписать код потока примерно так:
Код:
E-Mail: arigato.freelance@gmail.com
|
20.09.2024, 13:35 | #5 |
Регистрация: 19.09.2024
Сообщений: 5
|
4 минуты 08 секунд и 11% процессорного времени.
Есть подозрения, что теперь уже прохлаждается даже одно ядро, а процессы стоят в очереди за доступом к файлу. |
20.09.2024, 14:27 | #6 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,654
|
Проблема кроется скорее всего в том, что потоки банально мешают друг другу. Ведь данные хранятся в файле. Нагрузка ЦП тут вообще не показатель, так как узким местом будет именно операции с файлами. Чуть меньше процессор стал нагружаться из-за параметрического запроса.
Можно попробовать отключить Forced Writes командой в CMD: Код:
Эффект прироста производительности может дать пакетная вставка, то есть за один запрос сразу по несколько записей: Код:
E-Mail: arigato.freelance@gmail.com
|
23.09.2024, 08:16 | #7 |
Регистрация: 19.09.2024
Сообщений: 5
|
Всю однопоточную оптимизацию я давно прошел. Вплоть до EXECUTE BLOCK.
Сейсас специально сделал неоптимальный код, чтоб он максимально загружал процессор и хорошо было видно, разлеглись потоки по ядрам или нет. Вряд-ли диск - узкое место. На SSD, пусть и SATA, образовавшийся в результате добавления 3 миллионов записей 250-мегабайтный .GDB копируется в соседнюю папку за 2 секунды. Исходя из того, что однопоточный код грузит одно ядро на 100% все-таки склонен думать, что узкое место - какие-то вычисления самого FB, которые не умеют распараллеливаться. Склонен оставить задачу, как бесперспективную. Все-таки в документации написано, что FBE "Thread safe", но никто не обещал, что он "Thread optimized". Спасибо за помощь. |
23.09.2024, 14:13 | #8 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,654
|
Дело не в скорости диска, а в разделении ресурсов. Проще говоря, пока один из потоков производит запись данных, другие потоки вынуждены ждать. Почему я и предложил пакетный SQL, по идеи он должен ускорить работу, даже в случае однопотока за счет уменьшения количества обращений к СУБД.
E-Mail: arigato.freelance@gmail.com
|
23.09.2024, 16:16 | #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 |