Size: a a a

2021 March 10

PY

Popov Yuri in pro.cxx
За интелом давно наблюдаю а dsp библиотеки у них хороши.
источник

IZ

Ilia Zviagin in pro.cxx
SupaproBot
Переслано от Виктор
Программа делает уйму insert в mysql.
В секунду в несколько десятков таблиц.

На входе в функцию пакет запросов, на каждую таблицу - один запрос с кучей строк.
Сейчас всё идёт последовательно запрос за запросом отправляет.
Но получается слишком медленно - данные скапливаются быстрее чем успеваю их добавлять в БД.

Хочу попробовать распараллелить процесс вставки, т.е. каждый insert в отдельный thread.
Я знаю что в таких случаях используют пул потоков, я пока не очень понимаю как его сделать, но вопрос не в этом.

Сейчас, чтобы просто потестить, как пойдёт, я хочу попробовать что-то типа такого:

    std::vector <std::thread> th_vec;
   for (int i = 0; i < 50; ++i)
   {
       th_vec.push_back (std::thread(f));
   }
   for (int i = 0; i < 50; ++i)
   {    
       th_vec.at (i).join ();
   }


Так делать вообще хорошая идея или не особо?
Каждый INSERT в отдельный поток — это ТОЧНО не надо, слишком мелко.

Но не об этом ты думаешь. Тебе надо думать о другом, МОЖЕШЬ ли ты распараллелить разные запросы по потокам,
потому что в этом случае они будут выполняться не последовательно друг за другом, а асинхронно, и независимо друг от
друга, а также в отдельных транзакциях и в произвольном порядке.
При этом эти запросы даже могут друг другу мешать.

Секрет скорости вставки данных в БД лежит не в этом, не в параллельном исполнении вставок,
а в специальной обработке запросов, работе в пакетном режиме, правильном пакетировании запросов в транзакции, настройке сервера.
Лишь на самом последнем месте у тебя будет работа в параллель, да ещё она будет ограничена ресурсами самого сервера СУБД,
50 — это уж точно лишнее, это много, надо примерно несколько раз по числу процессоров на сервере СУБД, как максимум,
да ещё и надо учитывать, что не одного тебя этот сервер обслуживает, наверняка.
источник

IZ

Ilia Zviagin in pro.cxx
Lev Khoroshansky
Треды для такого не очень подходят, можешь посмотреть в сторону файберов
https://github.com/facebook/folly/tree/master/folly/fibers
Да не нужны они ему вообще.
источник

IZ

Ilia Zviagin in pro.cxx
Виктор
Не понял вопрос.
Все строки группируются на предыдущих этапах по таблицам. В функцию f (хоть это и не отражено в коде примера), передаётся конечный string sqlQuery. И f() просто инициирует отправку запроса в БД, никакой дополнительной обработки f() не производит.
Это ОЧЕНЬ плохо...
источник

IZ

Ilia Zviagin in pro.cxx
Виктор
Не понял вопрос.
Все строки группируются на предыдущих этапах по таблицам. В функцию f (хоть это и не отражено в коде примера), передаётся конечный string sqlQuery. И f() просто инициирует отправку запроса в БД, никакой дополнительной обработки f() не производит.
Ещё и SQLInjection наверняка..
источник

В

Виктор in pro.cxx
Ilia Zviagin
Каждый INSERT в отдельный поток — это ТОЧНО не надо, слишком мелко.

Но не об этом ты думаешь. Тебе надо думать о другом, МОЖЕШЬ ли ты распараллелить разные запросы по потокам,
потому что в этом случае они будут выполняться не последовательно друг за другом, а асинхронно, и независимо друг от
друга, а также в отдельных транзакциях и в произвольном порядке.
При этом эти запросы даже могут друг другу мешать.

Секрет скорости вставки данных в БД лежит не в этом, не в параллельном исполнении вставок,
а в специальной обработке запросов, работе в пакетном режиме, правильном пакетировании запросов в транзакции, настройке сервера.
Лишь на самом последнем месте у тебя будет работа в параллель, да ещё она будет ограничена ресурсами самого сервера СУБД,
50 — это уж точно лишнее, это много, надо примерно несколько раз по числу процессоров на сервере СУБД, как максимум,
да ещё и надо учитывать, что не одного тебя этот сервер обслуживает, наверняка.
Порядок вставки не имеет значения. Сервер у меня же на компе и крутится локальный. Хотя комп, конечно, слабоват 2 ядра на 4 потока и hdd, вместо ssd)), но попозже думаю на более мощной машине использовать.
Я сейчас читаю про оптимизацию запросов, а именно про отложенные устойчивые транзакции.
Меня просто несколько смущает сама идея создавать потоки в цикле. В инете об этом пишут, но, я уже не раз сталкивался что беру решение по аналогии реализации из инета, а потом оказывается так делать не очень хорошо. И в итоге приходится переписывать и переписывать код, спустя месяцы.
sql инъекции мне не грозят, ибо данные собираются, формируются и сохраняются чисто технические.
источник

IZ

Ilia Zviagin in pro.cxx
Виктор
Порядок вставки не имеет значения. Сервер у меня же на компе и крутится локальный. Хотя комп, конечно, слабоват 2 ядра на 4 потока и hdd, вместо ssd)), но попозже думаю на более мощной машине использовать.
Я сейчас читаю про оптимизацию запросов, а именно про отложенные устойчивые транзакции.
Меня просто несколько смущает сама идея создавать потоки в цикле. В инете об этом пишут, но, я уже не раз сталкивался что беру решение по аналогии реализации из инета, а потом оказывается так делать не очень хорошо. И в итоге приходится переписывать и переписывать код, спустя месяцы.
sql инъекции мне не грозят, ибо данные собираются, формируются и сохраняются чисто технические.
Нет, это как раз нормальный тот самый пул потоков.

Ну, почти.
источник

VO

Vyacheslav Olkhovche... in pro.cxx
баян про ркн и wg21 уже был?
источник

КП

Крылатый Пегас... in pro.cxx
Давай во флудилку уж.
источник

VO

Vyacheslav Olkhovche... in pro.cxx
не так просто найти линк на флудилку. в инфе не вижу
источник

SS

Sergey Sobolev in pro.cxx
Vyacheslav Olkhovchenkov
не так просто найти линк на флудилку. в инфе не вижу
источник

LA

Liber Azerate in pro.cxx
Vyacheslav Olkhovchenkov
не так просто найти линк на флудилку. в инфе не вижу
@stdvector Тут баян был
источник

KO

Konstantin Osipov in pro.cxx
Скажите пожалуйста, если у меня просто переменное число non-copyable аргументов известного мне конкретного типа, например class Big, но мне бы хотелось чтобы функция принимало произвольное число  аргументов, например foo(big1, big2) и foo(big1, big2, big3) - мне всё равно в variadic templates и parameter pack? с initializer_list только указатели использовать? (некрасиво)
источник

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
Скажите пожалуйста, если у меня просто переменное число non-copyable аргументов известного мне конкретного типа, например class Big, но мне бы хотелось чтобы функция принимало произвольное число  аргументов, например foo(big1, big2) и foo(big1, big2, big3) - мне всё равно в variadic templates и parameter pack? с initializer_list только указатели использовать? (некрасиво)
да, и проверять что все одинаковые
в 20м стандарте чуть покрасивее, примерно
auto std::same_as<Big>...
источник

CD

Constantine Drozdov in pro.cxx
ну с точностью до того, что всегда можно std::array принимать
источник

KO

Konstantin Osipov in pro.cxx
я юнит тесты пишу, мне хочется лаконичного синтаксиса...
источник

KO

Konstantin Osipov in pro.cxx
так то можно было бы конечно принимать и array и vector и initializer_list с указателями
источник

KO

Konstantin Osipov in pro.cxx
спасибо
источник

IZ

Ilia Zviagin in pro.cxx
Konstantin Osipov
Скажите пожалуйста, если у меня просто переменное число non-copyable аргументов известного мне конкретного типа, например class Big, но мне бы хотелось чтобы функция принимало произвольное число  аргументов, например foo(big1, big2) и foo(big1, big2, big3) - мне всё равно в variadic templates и parameter pack? с initializer_list только указатели использовать? (некрасиво)
А ссылки не годятся?
источник

KO

Konstantin Osipov in pro.cxx
я так понимаю, std::initializer_list<Big&> не будет работать.
источник