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

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

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

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

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

15 ответов

20 просмотров

Если я правильно понял и у тебя после каждой операции в бд летит 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
ну это же проще, главное что бы там буфер выдержал...

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

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

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

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта