|
http сервис с большим количеством данных | ☑ | ||
---|---|---|---|---|
0
gem
29.10.21
✎
19:44
|
Для сторонней системы (не 1с), делаю сервис для получения данных по документам поступление товаров и услуг за определенный период. Необходимо выгружать все данные, в том числе и табличную часть.
За день - это примерно 80 тыс. строк. жутко тормозит при формировании ответа json. Есть какие-то варианты, как это можно ускорить? |
|||
1
OldCondom
29.10.21
✎
19:48
|
ты одним ответом это шлешь? Разбей на разные сервисы.
К примеру в ОФД, данные по кассе получишь только в цикле сперва организаций, затем касс, затем отбор по дню и пр. |
|||
2
OldCondom
29.10.21
✎
19:49
|
ой, методы, а не сервисы
|
|||
3
OldCondom
29.10.21
✎
19:50
|
и да, отдавай частями, если больше 1к.
|
|||
4
gem
29.10.21
✎
19:51
|
(1) да, шлю одним методом.
Принимающая система так заточена, что хочет за выбранный период получить весь массив данных. не пойму, из-за чего так долго? ранее аналогичный сервис на web работал в разы быстрее |
|||
5
ДенисЧ
29.10.21
✎
19:53
|
Если ты захочешь 10ГБ с интернету скачать - тоже будешь плакаться, что медленно работает?
Внешнюю систему переточить Издаваемые файлы формировать заранее, сохранять, отдавать по запросу. |
|||
6
OldCondom
29.10.21
✎
19:53
|
(4) тогда частями отдавай. Нормальная практика.
|
|||
7
Ненавижу 1С
гуру
29.10.21
✎
19:56
|
+(3) добавь пагинацию, что-то типа параметров NBC top, skip
Если ответ содержит данных больше предельного значения вместо ответа формируй соответствующую ошибку |
|||
8
gem
29.10.21
✎
19:57
|
(6) это как? вначале сформировать пакеты и вернуть id каждого пакета?
дергая ID, уже получить порцию данных? |
|||
9
Ненавижу 1С
гуру
29.10.21
✎
19:59
|
(8) Пагинация
Функции, возвращающие массив значений, поддерживают параметры для порционной загрузки, которые передаются в виде query-строки(?$top=1&$skip=10). Пример: https://localhost:9000/api/v1/Docs?$top=5&$skip=10 При выполнении данного запроса мы получим максимум 5 записей начиная с 11 индекса в списке. |
|||
10
gem
29.10.21
✎
20:00
|
пример кода.
for each row in vt do str=new structure; ColIndex=0; for each col in vt.columns do colName=col.name; value=string(row.get(ColIndex)); ColIndex=ColIndex+1; try str[colName]=value; except execute ("str.insert("""+colName+""",)"); str[colName]=value; endtry; // enddo; array.add(str); enddo; |
|||
11
gem
29.10.21
✎
20:00
|
очень много уходит на формирование этой структуры
|
|||
12
Ненавижу 1С
гуру
29.10.21
✎
20:08
|
(10) это потому, что на буржуйском (шутка)
1. перед основным циклом - обойди список колонок и собери все их имена в одну строку, например СтрокаИменКолонок = "Поле1,Поле2,Поле3"; 2. далее в основном цикле сразу создавай структуру с этими колонками str=new structure(СтрокаИменКолонок); 3. убери внутренний цикл по колонкам, достаточно будет: ЗаполнитьЗначенияСвойств(str,row); |
|||
13
gem
29.10.21
✎
20:16
|
(12) в разы быстрее! спасибо!
|
|||
14
Ненавижу 1С
гуру
29.10.21
✎
20:27
|
(13) а вообще в типовом БСП есть метод
ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаЗначений) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |