170 похожих чатов

Всем привет! Скажу сразу .net fameork 4.7.2. Есть такой медленный

код, состоящий из двух синхронных операций. он в цикле по каждому элементу (200к записей) отправляет СИНХРОННО сообщение в очередь, а потом СИНХРОННО обновляет запись в БД. Работает крайне медленно. Около 1 секунды на одну запись. Цель ускориться.
Отправку в очередь я не могу как либо переделать, могу лишь завернуть в Task.Run.
Обновляение в бд я могу сделать Асинхронным.

Что я придумал: разбивать по странично по N=20 записей и для каждоой записи внутри пакета выполнять ту же самую логику, но асинхронно. То есть получу 20 тасок. И ожидать выполнение всех N тасок через Task.WhenAll. Когда пакет тасок выполнился, то беру следующий пакет и так пока все не обработаю.
Будет ли так побыстрее?

И другой вопрос, а что если я без разбивок на пакеты, просто для всех 200к записей создам СРАЗУ 200к тасок и буду ожидать их выполнения через Task.WhenAll. не произойдет ли истощение тредпула или рейс кондишн?

15 ответов

24 просмотра

Если я правильно понял и у тебя после каждой операции в бд летит 200к запросов, то это немного неправильно

_Д_- Автор вопроса
Artem Kuznetsov
Если я правильно понял и у тебя после каждой опера...

У меня для каждой записи летит запрос в Рэббит и потом один в бд. Оба синхронно

А 200к записей как хранятся? В памяти? Используется EF? Он на таких объемах тупит, конечно же. Нужно пагинацию мутить и очищать ChangeTracker после каждой странички. Синхрон/асинхрон не особо важен, если делается в 1 поток (одним пользователем всегда), и нет недостатка в потоках/ядрах. Я к тому, что асинки не дадут прироста во времени выполнения, они дадут возможность больше запросов обрабатывать параллельно, а это не одно и то же

_Д_- Автор вопроса
Владислав
А 200к записей как хранятся? В памяти? Используетс...

хранятся в памяти. используется даппер. а асинхронность я хотел мутить потому что подумал что если не терять время на ожидание пока один запрос выполнится где-то там, лучше сразу пакетом отправить эти запросы и дождаться от всех от них ответа через Task.WhenAll, тогда много потоков тред пула параллельно как отправят запрос так и обработают ответ. мне останется лишь дождаться их всех для одной пачки. не уверен наверняка но думал что там может быть быстрее. а сейчас планирую как мне посоветовали поизмерять для начала. Если проблема будет в том числе и с бд, в чем я уверен на 100%, то я буду буфферизировать запрос для бд, и выполнять через одну транзакцию сразу 100 команд для БД, а не как щас по одной. тогда как минимум та часть про бд, будет побыстрее

_Д_
хранятся в памяти. используется даппер. а асинхрон...

а как часто такие записи грузятся если 200К и по 1 сек на запись, то это 55 часов

_Д_- Автор вопроса
Alex SAS
а как часто такие записи грузятся если 200К и по 1...

я считал что у меня выходит 3600 записей за час. и это примерно 11 дней для 800к записей. а мне по факту надо не 200к а 800к перегнать для прода. 200к для дева где играюся

_Д_
я считал что у меня выходит 3600 записей за час. и...

по Апи обчно очень быстро улетает вопрос как на принимающей стороне устроено если там на каждую запись своя транзакция, то тогда примерно через 30-40К записей начинается ожидание свободных транзакций и естественно всю тупит попробуй отправлять туда в 4 потока и замерь время если будет уходить так же 3600 то проблема с той стороны

_Д_- Автор вопроса
Alex SAS
по Апи обчно очень быстро улетает вопрос как на пр...

А что на принимающей то стороне? Принимающая сторона это кролик и база данных)

_Д_
А что на принимающей то стороне? Принимающая сторо...

а он сколько может переварить записей в минуту?

_Д_- Автор вопроса
Alex SAS
а он сколько может переварить записей в минуту?

Без понятия. Я туда кинул через метод, который мне навязали, и забыл про него. Мне дальше все равно что он делает) Мне надо измеРить оба действия а потом уже буду думать 🤔

_Д_
Без понятия. Я туда кинул через метод, который мне...

логика там же такая что то пришло если прошло валидацию запись в БД ответ что записали после чего ты можешь отправить следующую запись ставь логер перед отправкой и после ответа что ок и сравнивай время если в начале будет 0,1 сек а с N отправки 0,5 сек то проблема не у тебя

_Д_
Без понятия. Я туда кинул через метод, который мне...

и уточни у своих, можешь ли ты туда пакетно отправлять

_Д_- Автор вопроса
Alex SAS
логика там же такая что то пришло если прошло вал...

Я ещё раз говорю. Я просто кидаю в кролик. Не жду никаких ответов! Никакой валидации. Ни че го, кроме «я тебе покушать принёс возьми пожалуйста». И нет пакетного апи нет для метода. Все что я могу сделать это изменить второй метод при работе с бд тк он полностью мой, а метод для работы с кроликом максимум могу обернуть в таску. Не более того

_Д_
Я ещё раз говорю. Я просто кидаю в кролик. Не жду ...

ну это же проще, главное что бы там буфер выдержал )) распараллель на 4 потока, в каждом все то что у тебя сейчас и так работает, что бы работало с 1/4 данных и проверяй

_Д_- Автор вопроса
Alex SAS
ну это же проще, главное что бы там буфер выдержал...

Ну вот примерно это и спрашивал… мол я думал сделать по чанкам, а Денис подсказал партишионер)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта