|
Заполнение ресурса регистра в котором 1.5 млн записей | ☑ | ||
---|---|---|---|---|
0
zippygrill
10.01.24
✎
14:04
|
Привет,
Пытаюсь заполнить новый ресурс регистра сведений (независимый, непериодческий) в котором 1.5 млн записей. Генерирую 20 потоков которые обрабатывают по n-количество записей (1.5млн/20) в фоне в каждый поток. Примерно через ~10 минут все 20 фоновые задания завершаются аварийно. Сама процедура заполнения и сохранения записи https://pastebin.com/VzL6GWfM Сперва делал через транзакцию и блокировку управляему. Потом убрал это их, вроде шестрее стало, но без блокировки по измерению боюсь в какой-то момент появится конкурирующий процесс и возможны коллизии если выполнить код в рабочее время? |
|||
1
Лефмихалыч
10.01.24
✎
14:08
|
Какие измерения есть у регистра?
|
|||
2
Лефмихалыч
10.01.24
✎
14:09
|
для чего ты читаешь запись, если все ее данные у тебя есть до чтения?
|
|||
3
Волшебник
10.01.24
✎
14:10
|
Оставьте 1 поток на ночь
|
|||
4
Лефмихалыч
10.01.24
✎
14:10
|
нахрена "ручная" транзакция там, где платформа и так транзакцию создает?
|
|||
5
Лефмихалыч
10.01.24
✎
14:11
|
есть основания полагать, что регистр можно просто trancate table и просто начисто перезаполнить, раз данные его вычисляются из бизнес процесса. Нахрена он вообще нужен такой?
|
|||
6
zippygrill
10.01.24
✎
14:12
|
(1) https://prnt.sc/7RP_RP9coXwF
(2) Почему бы читать что есть и дополнительно заполнить новый ресурс? (3) будет перерасход памяти и вырубится как всегда и до этого пытался в один поток это сделать. |
|||
7
zippygrill
10.01.24
✎
14:16
|
(5) Это будет крайний метод, придется разобраться в логике заполнения из БП..
(4) А в каких примерах надо тогда явную транзакцию, со ссылкой на ИТС? |
|||
8
Табуретко
10.01.24
✎
14:18
|
(6) чтоб небыло перерасхода памяти, не нужно все пихать в одну транзакцию...
|
|||
9
Лефмихалыч
10.01.24
✎
14:19
|
(6) завершен - измерение?.. о_0 аднака
правильный ответ на 2 - потому, что есть еще 100500 ресурсов. Итого, убери свою транзакцию и оставь на ночь в одном потоке. А память у тебя кончается потому, что утечка в коде, который вызывает твою ОбработатьПорциюЗаполненияШаблонаДанныеБизнесПроцессов() |
|||
10
Волшебник
10.01.24
✎
14:20
|
(6) Не будет
|
|||
11
Лефмихалыч
10.01.24
✎
14:24
|
(10) будет-будет. Раз падает, значит утечка есть, просто в том месте, которое он не показывает
|
|||
12
Волшебник
10.01.24
✎
14:27
|
(11) Ну тогда добавить ещё одно задание-менеджер, которое перезапускает рабочее, если оно упало.
|
|||
13
zippygrill
10.01.24
✎
14:29
|
(8) Транзакция в цикле, те для каждой записи (в закомментированном коде)
|
|||
14
zippygrill
10.01.24
✎
14:31
|
(9) Подготовка данных для запуска фз https://pastebin.com/0zQz8EjZ
|
|||
15
zippygrill
10.01.24
✎
14:34
|
(9) Убрать транзакцию и блокировку. Те в текущем варианте? https://pastebin.com/VzL6GWfM
|
|||
16
Лефмихалыч
10.01.24
✎
14:37
|
ты в этих своих потоках один и те же бизнес-процессы обрабатываешь
|
|||
17
Лефмихалыч
10.01.24
✎
14:38
|
понлы биздесь, конечно...
|
|||
18
Лефмихалыч
10.01.24
✎
14:40
|
И НЕ ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон ЕСТЬ NULL
это условие всегда истинно а вот это может быть истинным только, если этот УК_Шаблон имеет составной тип ДанныеБизнесПроцессов.УК_Шаблон = НЕОПРЕДЕЛЕНО |
|||
19
Лефмихалыч
10.01.24
✎
14:42
|
удали просто весь свой код полностью
|
|||
20
Лефмихалыч
10.01.24
✎
14:42
|
в нем проблема
|
|||
21
zippygrill
10.01.24
✎
14:43
|
(17) почему?
(18) УК_Шаблон - имеет составной тип - поэтому и условие ДанныеБизнесПроцессов.УК_Шаблон = НЕОПРЕДЕЛЕНО |
|||
22
Волшебник
10.01.24
✎
14:42
|
Наверное имелось в виду
И ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон <> ЗНАЧЕНИЕ(Справочник.ШаблоныБП.ПустаяСсылка) |
|||
23
Лефмихалыч
10.01.24
✎
14:43
|
(21) я тебе говорю - это условие всегда истинно потому, что NULL 1С хранить не умеет, нул может только в соединении появиться
|
|||
24
Smit1C
10.01.24
✎
14:43
|
(0) сколько ядер на процессоре ?
|
|||
25
Лефмихалыч
10.01.24
✎
14:45
|
если там несколько типов, то
И НЕ ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон.Ссылка ЕСТЬ NULL однако, исходя из того, что ты добавил ресурс и хочешь его заполнить, условие неправильное, оно как раз выбирает те записи, которые тебе не нужны, то есть, в которых всё заполнено |
|||
26
zippygrill
10.01.24
✎
14:46
|
(23) Результат запроса этого поле говорит что там null https://prnt.sc/ijdDlFs-MKSS
|
|||
27
zippygrill
10.01.24
✎
14:46
|
(24) Нет такой инфы
|
|||
28
Smit1C
10.01.24
✎
14:47
|
(27) без этой цифры нет особого смысла параллелить вычисления.
|
|||
29
Лефмихалыч
10.01.24
✎
14:49
|
(26) не правда. Там Неопределено
|
|||
30
zippygrill
10.01.24
✎
14:50
|
(25) Те ссылку надо сравнить с null, а не реквизит составной?
|
|||
31
Лефмихалыч
10.01.24
✎
14:50
|
пойду убьюсь об стенку
|
|||
32
Волшебник
10.01.24
✎
14:53
|
(30) Гляньте (22)
|
|||
33
Лефмихалыч
10.01.24
✎
14:54
|
короче, у тебя код и запрос - хрень. Ты разным потокам выдаешь пакеты с одними и теми же ссылками и выполняешь повторную обработку сотни тысяч раз.
Многопоточная обработка делается не так. Ты сначала должен выбрать всё из БД, потом побить на окна и отправить все куски на обработку. Твой же код не учитывает, что между твоими запросами еще не все записи из предыдущих окон успели обработаться. |
|||
34
Лефмихалыч
10.01.24
✎
14:55
|
(32) нет. Раз тип составной, значит там могут быть и еще справочники, а значит такой запрос соберет и заполненные ссылки тоже, которые заполнены, но ссылкой на другой справочни
|
|||
35
zippygrill
10.01.24
✎
14:57
|
(32) В моем случае неправильно будет указать .ПустаяСсылка() тк ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон - СправочникСсылка.ШаблоныИсполнения, СправочникСсылка.ШаблоныСогласования, и тд..
|
|||
36
zippygrill
10.01.24
✎
14:59
|
(33) Твой же код не учитывает, что между твоими запросами еще не все записи из предыдущих окон успели обработаться -- Зачем ждать обработку предыдущих окон, если я разбил все записи по определенной Дате?
|
|||
37
zippygrill
10.01.24
✎
15:00
|
(32) значит так должно быть И ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон <> НЕОПРЕДЕЛЕНО
|
|||
38
Лефмихалыч
10.01.24
✎
15:01
|
.ПустаяСсылка() в запросе отсутствует.
Друг, а чем ты занимался последние 13 лет? Это ж чертова база. В общем, удали свои фоновые задания и обрабатывай одним потоком. |
|||
39
Лефмихалыч
10.01.24
✎
15:03
|
(36) подумай. Просто прими факт, что вдруг я прав и подумай, при каких условиях так может быть с учетом твоего кода.
|
|||
40
Волшебник
10.01.24
✎
15:04
|
(38) >> обрабатывай одним потоком
Я так и сказал в (3) |
|||
41
Timon1405
10.01.24
✎
15:06
|
(29) если ДанныеБизнесПроцессов.БизнесПроцесс пустая ссылка, то там нулл.
нул может только в соединении появиться БизнесПроцесс.Шаблон - и есть соединение, которое вы не увидели откуда такое недоверие к ТС? он же проверил запрос в консоли перед тем как совать его в обработку данных |
|||
42
СвинТуз
10.01.24
✎
15:08
|
(0)
Мудрено как то. Спешишь куда то? Если не спешишь, выбирай порциями хоть по 100 штук, ночами. Заполняй набор и пиши. |
|||
43
Лефмихалыч
10.01.24
✎
15:09
|
(41) хмм.. да, точно, пропустил
ТС не в курсе, как хранятся составные типы, откуда мне знать, отличает ли он нул от неопределено в выборке. Да. Условие "И НЕ ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон ЕСТЬ NULL" действительно не является всегда истинным. Только в (33) это ничего не меняет |
|||
44
СвинТуз
10.01.24
✎
15:11
|
(42)
И пока не кончаться не заполненные. |
|||
45
Волшебник
10.01.24
✎
15:12
|
(42) Набор по 100 штук не сработает. Тут вам не там
|
|||
46
СвинТуз
10.01.24
✎
15:14
|
(45)
Возьми 1 000. Надо писать. Если упадет, заполнение то останется. |
|||
47
СвинТуз
10.01.24
✎
15:16
|
(46)
Если конечно нужно просто заполнить. Писать порциями. Выбирать не заполненные. Пусть падает. |
|||
48
zippygrill
10.01.24
✎
15:16
|
(43) Твой же код не учитывает, что между твоими запросами еще не все записи из предыдущих окон успели обработаться. -- ты тут описываешь последовательная обработка данных.
Я же запускаю паралельную обработку порций данных, которых я ранее разбил по дате. |
|||
49
Garykom
10.01.24
✎
15:17
|
(0) В твоем узком случае проще создать несколько записей тестовых из 1С
А затем напрямую прямыми запросами фигачить в субд |
|||
50
zippygrill
10.01.24
✎
15:17
|
(47) В продуктивах то надо одним ходом заполнить, а не растягивать по времени..
|
|||
51
СвинТуз
10.01.24
✎
15:17
|
(45)
Мощность множества не более чем счетно. Кончится быстро. |
|||
52
Garykom
10.01.24
✎
15:18
|
(49)+ Тебе же надо просто https://learn.microsoft.com/ru-ru/sql/t-sql/queries/update-transact-sql?view=sql-server-ver16
|
|||
53
СвинТуз
10.01.24
✎
15:18
|
(50)
И что? запускай хоть раз в 10 секунд и долби. |
|||
54
zippygrill
10.01.24
✎
15:20
|
(49) Да вроде получается и потоками в ФЗ это сделать. Просто хочется чтобы код 1С был безопастным и корректным
|
|||
55
СвинТуз
10.01.24
✎
15:20
|
(50)
+ все трудности от большого объема записываемых данных. Нужно уменьшить. |
|||
56
СвинТуз
10.01.24
✎
15:21
|
(54)
Ну раз нет желания обойти, то удачи. Нормальные герои всегда идут в обход. |
|||
57
Garykom
10.01.24
✎
15:21
|
(54) У тебя "УК_Шаблон = КлючЗнч.Шаблон" всегда разное или повторяется для разных записей?
|
|||
58
zippygrill
10.01.24
✎
15:24
|
(57) Шаблонов от силы 5-7. Хочешь предложить разбить порцию по шаблонам? Можно но зачем, всего лишь другой критерий разделения.
|
|||
59
СвинТуз
10.01.24
✎
15:24
|
(0)
Вариант для крутых. Пиши в СКЛ_Сервер прямым запросом ночью. |
|||
60
Garykom
10.01.24
✎
15:25
|
Ну и зачем по одной записи?
Когда общепринято (в типовых например) использовать ТЗ и СоздатьНаборЗаписей ... Загрузить(ТЗ) ... Записать() |
|||
61
СвинТуз
10.01.24
✎
15:25
|
(0)
И зачем каждый раз заполнять уже заполненное? Есть такая необходимость? Ты же каждый раз с начала начинаешь? |
|||
62
zippygrill
10.01.24
✎
15:25
|
(59) Да нет у меня доступа к инфраструктуре)
|
|||
63
Garykom
10.01.24
✎
15:26
|
(58) Да. Выгрузить из РС в ТЗ по фильтру.
Заполнить колонку УК_Шаблон, Загрузить и Записать |
|||
64
zippygrill
10.01.24
✎
15:27
|
(60) А как мне Набор поможет если в каждой записи измерение разное?
|
|||
65
СвинТуз
10.01.24
✎
15:28
|
(62)
36 лет. Вроде большой мальчик? Не пускают? Договорись. |
|||
66
Garykom
10.01.24
✎
15:28
|
(64) кто мешает в (63) фильтру составную?
|
|||
67
СвинТуз
10.01.24
✎
15:28
|
(64)
Иногда желание решить задачу как задумал сильнее здравого смысла. Удачи. |
|||
68
Garykom
10.01.24
✎
15:31
|
(66)+ В несколько потоков раздельное чтение (только чтение, без записи) блокировки таблиц не происходит
|
|||
69
Garykom
10.01.24
✎
15:30
|
(68)+ Вот подобрать размер ТЗ (количество записей) для записи в РС это уже на практике, чтобы в несколько потоков блокировки были минимальны
|
|||
70
СвинТуз
10.01.24
✎
15:30
|
Кстати у метода "Записать" есть параметр.
Отбор можно и не ставить. Не важно. Возможно путаю )))) Сами разберетесь. |
|||
71
Garykom
10.01.24
✎
15:35
|
Групповые методы (НаборЗаписей) обычно всегда шустрей чем одиночные (МенеджерЗаписи) в цикле
|
|||
72
Лефмихалыч
10.01.24
✎
15:38
|
(71) для этого регистра набор записей будет записываться точно так же по одной строке, по этому прироста на практике заметного не будет.
|
|||
73
Garykom
10.01.24
✎
15:40
|
(72) Надо проверять
В какие запросы sql это будет транслироваться и как сервером 1С |
|||
74
Волшебник
10.01.24
✎
15:41
|
(70) Сейчас Вы насоветуете до уничтожения регистра. Идите уже
|
|||
75
Лефмихалыч
10.01.24
✎
15:43
|
(73) я проверял :)
|
|||
76
Garykom
10.01.24
✎
15:44
|
(74) Это уже советовали, сохранить данные из РС, грохнуть таблицу и заново создать с заполнением ))
|
|||
77
Лефмихалыч
10.01.24
✎
15:45
|
Я бы (без обид, я из лучших побуждений) не советовал ТСу в скуль лезть. Так можно из одной проблемы две сделать очень легко.
|
|||
78
Garykom
10.01.24
✎
15:45
|
(75) Т.е. там нет на низком уровне потерь от цикла на ЯП 1С?
Когда вместо него передается ТЗ сразу? |
|||
79
Лефмихалыч
10.01.24
✎
15:45
|
(76) первым делом
|
|||
80
Лефмихалыч
10.01.24
✎
15:46
|
(78) на низком уновне запись большого набора независимого регистра с заменой транслируется в построчное delete from + insert into
|
|||
81
Волшебник
10.01.24
✎
15:51
|
(78) Эти потери меркнут на фоне транзакции на запись в БД.
|
|||
82
СвинТуз
10.01.24
✎
16:02
|
(74)
Оно просто не запишется. Если запись есть уже. |
|||
83
kauksi
10.01.24
✎
16:09
|
А может вообще данные этого регистра во внешний источник данных вынести? и там средствами языка SQL делать что то с данными? а из 1с уже обращаться к ним?
|
|||
84
Волшебник
10.01.24
✎
16:09
|
(82) Остыньте. Ваша идея с наборами уже отвергнута.
|
|||
85
СвинТуз
10.01.24
✎
16:11
|
(74)
Он просто работать не хочет. Хочет на Мисте общаться. Цените. 1 500 000 записей на наборы по 1 000 записей = 1 500 наборов. Если запускать один набор в минуту это чуть больше суток работы. Отбирать не заполненные. При записи набора из 1 000 записей упасть не должно. Можно писать поштучно, тогда даже в случае падения останется меньше. |
|||
86
OldCondom
10.01.24
✎
16:11
|
А какой смысл делать несколько потоков на записи с идентичными измерениями? Только упадет скорость.
В один поток, транзакциями 10-100 или сколько удобно штук записей и все ок будет. 1.5млн не особо серьезно. |
|||
87
Волшебник
10.01.24
✎
16:14
|
(85) Здесь набор не прокатит, потому что измерения разные, см. (64)
Даже 2 записи в набор не запихнёте |
|||
88
СвинТуз
10.01.24
✎
16:23
|
(87)
Менеджер. Выбирать запросом первые 1 000 не заполненные. И по одной. Блокировка ему не нужна. за 25 часов обработка перелопатит при запуске раз в минуту. Если брать по 2 000 за 12,5 часов. |
|||
89
СвинТуз
10.01.24
✎
16:25
|
Можно индекс для скорости на реквизит поставить.
После заполнения убить. |
|||
90
СвинТуз
10.01.24
✎
16:31
|
Как ИМХО так ТС тупит страшно.
Каждый раз сначала начинает. Но я старый с маразмом. ))) Молодежи виднее. |
|||
91
СвинТуз
10.01.24
✎
16:34
|
(29)
Потому что тип не выбран. |
|||
92
zippygrill
10.01.24
✎
16:36
|
Спасибо,
Код по ссылке в самом начале за ~30 мин заполнил все мои интересующие записи. |
|||
93
СвинТуз
10.01.24
✎
16:39
|
(29)
NULL это когда "Использование" у реквизита справочника только для родителя, например, а обращаешься не к группе. (87) Но это только новисы знают ))). Так же как и про параметр у метода. Насипова про то "за что увольняют" все слышали, а в хелп не все смотрели. Не важно. Пойду посплю. Всем хорошего и успехов в работе. |
|||
94
Лефмихалыч
10.01.24
✎
16:44
|
||||
95
СвинТуз
10.01.24
✎
16:50
|
(94)
Да сомнительно. Выигрыш в скорости запроса. Проигрыш при записи. Потому что пишем большой объем данных построчно, и индекс тоже перезаписывается. Все не интересно. |
|||
96
Волшебник
10.01.24
✎
20:32
|
(95) Сдавайтесь. Вам не победить этот сабж.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |