Как передать в фоновое задание большую таблицу значений (12 млн записей) #725664


#0 by Solemn
Добрый день коллеги, пытаюсь с помощью многопоточности ускорить обработку таблицы значений, но встал вопрос как эту таблицу передать в фоновое задание, через параметры если передавать, то пожирается гигов 30 памяти на сервере 1С и повисает, запуска самих заданий не дождался, есть какие идеи?
#0 by Solemn
Добрый день коллеги, пытаюсь с помощью многопоточности ускорить обработку таблицы значений, но встал вопрос как эту таблицу передать в фоновое задание, через параметры если передавать, то пожирается гигов 30 памяти на сервере 1С и повисает, запуска самих заданий не дождался, есть какие идеи?
#0 by Solemn
Добрый день коллеги, пытаюсь с помощью многопоточности ускорить обработку таблицы значений, но встал вопрос как эту таблицу передать в фоновое задание, через параметры если передавать, то пожирается гигов 30 памяти на сервере 1С и повисает, запуска самих заданий не дождался, есть какие идеи?
#1 by Looser-1c
В файл выгружай
#2 by Kalambur
там наверно ключевое "ускорить обработку "
#3 by Господин ПЖ
база на скуле? такую таблицу проще затолкать в таблицу скуля и обработать там, если она на куски не рубится
#4 by Solemn
а мысль :)
#5 by Looser-1c
кстати, вариант...
#6 by tridog
И кто только придумал эту ересь - передавать огромные ТЗ в параметры фонового задания. Распараллеливают они, ппц Лучше придумать другой алгоритм "диспетчерзиации" задач между запущенными заданиями. Так, чтобы не требовалось гонять половину базы в оперативной памяти (а это и происходит при передаче параметров фонового задания).
#7 by Looser-1c
И ещё кстати... Почему не заставить РЗ самому получить эти 12 лямов строк?
#8 by Solemn
Этот вариант оч. долго согласовывать, и скорее всего не одобрят, плюс доступы на SQL выпрашивать. И не совсем понятно как объектные сущности в таблице значений разложить в таблице SQL много шаманства по моему будет
#9 by Looser-1c
"Этот вариант оч. долго согласовывать" Беги оттуда
#10 by Господин ПЖ
формально он у тебя есть - ты же в базу ходишь как-то
#11 by Euguln
+ резонный вопрос, откуда она взялась, такая табличка.
#12 by Господин ПЖ
>И не совсем понятно как объектные сущности в таблице значений разложить в таблице SQL много шаманства по моему будет мы не в курсе накой черт тебе 12 лямов записей
#13 by Solemn
Мне они не нужны, табличка из типового проведение себестоимости УПП (РАУЗ)
#14 by Solemn
Если РЗ=ФЗ, то думал об этом, но к сожалению в моей задаче это не сработает
#15 by vhl
Изначально не выносить с сервера на клиент
#16 by Solemn
Передается из одной процедуры выполняемом в серверном общем модуле, в фоновое задание, которое то же на сервере выполняется.
#17 by Локи-13
а что именно запускается в несколько потоков?
#18 by H A D G E H O G s
Сериализация-десериализация ТЗ способны устроить кошмар любой системе.
#19 by H A D G E H O G s
Как эта ТЗ формируется? Очень сложно?
#20 by Зеленый пень
Добавь свой регистр сведений - будет как ТЗ.
#21 by Господин ПЖ
>Как эта ТЗ формируется? Очень сложно? запускают чего-то типа расчет себестоимости - и привет
#22 by МихаилМ
тз ->хз. можно еще попробовать хз в строку внутреннюю. либо тз с хз и в временный файл.
#23 by H A D G E H O G s
Хреновое решение.
#24 by Локи-13
где ТС? что распараллеливается то?
#25 by Господин ПЖ
было не так давно в одной отраслевой упп... модуль проведение документа. внутри два цикла, один в другой вложен внутри 2-го обход ТЧ и набивание ТЗ построчно... теперь простая арифметика: и каждый счетчик циклов по 100 итераций ТЗ = 10 000 000 строк клиент "думает" до 2 Гб и падает
#26 by H A D G E H O G s
Огласи чемпиона.
#27 by Господин ПЖ
что делает клиент? звонит во франь, консультант франя заходит по rdp на сервак и (о чудо!) проводит документ. За 10 минут. Сервак 64-бит. А значит 3,5 Гб на клиента скребя ложкой по дну ему хватает. какой вывод сделал франь? купите 64-бит сервер 1с...
#28 by Локи-13
так куплен же. что еще покупать?
#29 by Господин ПЖ
так дело в том, зайка моя, что от него толку в (25, 27) будет 0 без переписывания кода...
#30 by Господин ПЖ
у тебя то сервер падает
#31 by Solemn
Запись движений в базу (сколько строк столько и движений)  :)
#32 by Solemn
+ движений=записей в регистр накопления
#33 by Лефмихалыч
а нельзя эту ТЗ прямо внутри фонового генерить?
#34 by Лефмихалыч
+ например, в фоновое передавать только организацию, подразделение и там группу какой-нить номенклатуры, а таблицу оборотов (предположим, что речь про обороты) получать из базы уже там
#35 by Solemn
нет, так как запрос делается по движениям в базе, которые потом либо меняются либо удаляются (после запроса), если один фон начнет менять движения, а второй начнет их только читать перед подготовкой ТЗ, то в итоге они будут работать с разными таблицами значений
#36 by H A D G E H O G s
Пусть фоны читают ТЗ и ждут, пока все флаги в служебном регистре сведений не установятся в "Можно писать"
#37 by 18_plus
ДЛЯ ИЗМЕНЕНИЯ не годится в этом случае?
#38 by Solemn
управляемый режим давно уже включен, "ДЛЯ ИЗМЕНЕНИЯ" игнорится, наверное можно управляемую блокировку установить, только по таймауту тож легко вылететь Наверное в регистр в ресурс с типом ХранилищеЗначения проще положить саму табличку, спасиб за идею с регистром, ща буду пробовать
#39 by H A D G E H O G s
Нет, не проще.
#40 by H A D G E H O G s
При положении в ХЗ пойдет сериализация в XDTO + кодирование в base64, которое, я боюсь, выполнено через опу.. При извлечении из ХЗ пойдет обратный процесс.
#41 by Гёдза
почему флаги, а не блокировки?
#42 by H A D G E H O G s
На тот невероятный случай, когда один процесс прочтет и запишет данные раньше, чем запустится другой процесс.
#43 by H A D G E H O G s
Мало ли.
#44 by КонецЦикла
21-й век на дворе, а все возитесь с таблицами значений? Пригласите специалиста...
#45 by ПушЫстый подмышко
А специалист с чем будет возиться?
#46 by Локи-13
нет, зачем франч предложил купить 64бит сервер, если он уже есть? на который консультант зашел через рдп.
#47 by Solemn
Пишется и читается вне транзакции, блокировки вообще не сработают, плюс (если делать в транзакции) большая вероятность таймаута
#48 by H A D G E H O G s
"Пишется и читается вне транзакции" Это ты так думаешь.
#49 by Локи-13
распараллеливается запись одного набора? и в наборе 12 миллионов строк? что-то я не очень понял... странно что все пытаются придумать что делать с тз, вместо того, чтобы удостовериться в том, что в принципе выбрана правильная методика решения задачи.
#50 by H A D G E H O G s
Я думаю -там регистраторов по числу потоков.
#51 by Волшебник
накой черт тебе 12 лямов записей?
#52 by Локи-13
тогда почему нельзя приготовить отдельные наборы с меньшим числом записей на базе этой таблицы, и передавать уже их?
#53 by Лефмихалыч
разбей данные на не пересекающиеся куски и читай-пиши, сколько угодно и когда угодно
#54 by Лефмихалыч
Короче, вот тут описано, как это надо делать map/reduce в чистом виде. Иначе ни какого ускорения не получится и вся параллельность будет валиться на блокировках
#55 by Solemn
Мне то они не нужны, типовой расчет себестоимости в упп 1.3, по методологии расчета вопрос тож не ко мне, не я ее утверждал.
#56 by tridog
XDTO тут не причем, это другая сериализация)
#57 by Solemn
Да, не получилось в ХранилищеЗначения в рег. сведений поместить, 200 тыс. записей легко прошли сек. за 20, а на 5 млн отвалилось по ошибке потока (
#58 by Solemn
+ через 15 минут отвалилось
#59 by H A D G E H O G s
Проверял?
#60 by tridog
Вы пытаетесь сделать какое-то "еврейское" распараллеливание - думаю, что ничего у Вас не выйдет. Предполагаемая модель для распределения задач по "потокам" - убога и нежизнеспособна. Вместо того, чтобы пытаться с помощью "молотка и такой-то матери" как-то передать ТЗ "потоку" - гораздо перспективней будет подойти к вопросу с другой стороны. Проанализировать алгоритм, определить на какие атомарные операции его можно разбить - и уже от этого "плясать"
#61 by tridog
Угумс. Типы, не имеющие XDTO-сериализации - прекрасно помещаются в хранилище значения. Есть и обратные примеры - когда тип помещается в хранилище, но не имеет XDTO-сериализации. Исследования методом "научного тыка" показали, что, помещение в хранилище значения - эквивалентно ЗначениеВСтрокуВнутр, а не XDTO-сериализации.
#62 by H A D G E H O G s
Все такие умные, что ППЦ. Ну, разбей хотя бы алгоритм удаления движений по нескольку регистров на поток - заипешься код писать, а потом (самое главное) ошибки ловить. Это примитив. А мы тут про расчет себестоимости.
#63 by tridog
+ Обратные примеры - когда тип имеет XDTO-сериализацию, но в хранилище значения не помещается. Очепятался
#64 by H A D G E H O G s
ТЗ имеет XDTO сериализацию.
#65 by tridog
Многопоточность это вообще сложно. И что? Есть типы, которые ее не имеют - но в хранилище помещаются. И наоборот, есть типы которые не помещаются в хранилище, но пишутся в XDTO
#66 by H A D G E H O G s
Исследования методом "научного тыка" показали. Что делалось?
#67 by Локи-13
вроде как эту штуку пофиксили в 8.3
#68 by tridog
Вкратце - перебирались почти все типы встроенного языка (вплоть до ОбъектМетаданных, ИсторияРаботыПользователей, РасширенноеИмяXML - и прочего безобразия). Для каждого типа делалась попытка: 1. Поместить в хранилище значения 2. СериализаторXDTO.ЗаписатьXML 3. ЗначениеВСтрокуВнутр Совпадение между 1 и 3 - 100% Между 1 и 2 - сильно меньше
#69 by H A D G E H O G s
Масштабно, епта. Результаты опубликуй. ТЗ В XDTO есть? Нет? А если найду?!
#70 by tridog
Если найду - опубликую. Еще выяснилось, что просто ЗаписатьXML - который метод глобального контекста - тоже сильно разнится с СериализаторXDTO.ЗаписатьXML. ТЗ в XDTO есть :) Но это не значит, что помещение в хранилище значения - есть XDTO
#71 by H A D G E H O G s
ЗаписатьXML - который метод глобального контекста - тоже сильно разнится с СериализаторXDTO.ЗаписатьXML. of course!
#72 by tridog
Это имеет не очень не много смысла. Подозреваю, что просто ЗаписатьXML от 8.0 остался, пока XDTO не было.
#73 by Serginio1
Я через  выгружал в текстовый файл и булками загружал во временную таблицу. Ты случайно с ЗаписатьXDTO  не путаешь?
#74 by H A D G E H O G s
Дааа, ты чертовски прав.. 1) Создал справочник с реквизитом ХЗ. 2) Выполнил код     "ВЫБРАТЬ ПЕРВЫЕ 10 3) Записал. 4) В SQL -е этот реквизит (image поле) выгрузил в файл. 5) Там даже не в base64, а тупо текст. {0,"Ссылка", {"Pattern", {"L"}, {"#",dd0e8719-5e55-43a0-944a-8321d4c46843} },"Ссылка",25}, {1,"Артикул", {"Pattern", {"S",25,1}, {"L"} },"Артикул",25}, {2,"Весовой", {"Pattern", {"B"}, {"L"} },"Весовой",2} }, {2,3,0,0,1,1,2,2, {1,10, {2,0,3, {"#",dd0e8719-5e55-43a0-944a-8321d4c46843,124:8019001517615d5d11dfdff551bb732a}, Простите за кодировку, было лениво морочиться.
#75 by H A D G E H O G s
Это печально.
#76 by H A D G E H O G s
Млядские строки, неужели нельзя в ХЗ сохранять кусок памяти.
#77 by MM
Так там не один кусок памяти, а набор объектов (строки ТЗ, колонки) содержащих друг на друга, наверно. Может стоит указать объект СжатиеДанных?
#78 by Serginio1
Кстати а как насчет использования ЗаписьFastInfoset
#79 by Serginio1
78 Типа такого
#80 by tridog
Вот тут я конечно тот еще басист - но что-то мне подсказывает, что если просто сохранять кусок памяти - то его потом будет оооочень сложно прочитать следующей версией, когда в плюсовом классе будет изменен состав членов. Например, в той же Java - если сделать implements Serializable и не реализовывать свои writeObject и readObject - то именно так и получится. А если реализовывать writeObject и readObject - то это уже не будет "просто кусок памяти".
#81 by tridog
Все равно будет строка. В которую будут преобразованы двоичные данные :)
#82 by МихаилМ
Вы забыли указать степень сжатия при создании хранилища.
#83 by Serginio1
Сериализация разная бывает. Есть по аналогии с Базой Данных с разруливанием циклических ссылок. Например
#84 by Serginio1
83+
#85 by tridog
protobuf, как и json - всего-лишь форматы. Ничего нового в такое понятие как сериализация они не приносят. К тому же, даже из вашей ссылки на вики: > По замыслу разработчиков сначала должна быть описана > структура данных, которая затем компилируется в классы, > представляющие эти структуры. Вместе с классами идет код > их сериализации в компактный формат представления. В > дальнейшем используя высокоуровневые языки > программирования такие как Java, C++ или Python > осуществляется чтение и запись данных. > Protocol Buffers не предназначен для чтения пользователем > и представляет собой двоичный формат. Для десериализации > данных необходим отдельный .proto-файл, в котором > определяется формат сообщения. Т.е. опять-таки нет речи о том, чтобы просто взять кусок оперативной памяти и зафигачить в файл (а потом просто прочитать из файла). На основании объекта класса строится DTO-представление, которое уже и пишется файл.
#86 by arsik
ИМХО - Все намного проще делается. Не лучше все движения запихнуть во временную таблицу с полем порядковый номер. И забирать уже из временной по условию (от 1 до милиона) - первый поток, от милиона+1 до двух милионов - второй поток и тд.
#87 by tridog
Для этого всего-лишь нужно умудриться передать в другой сеанс менеджер временных таблиц)
#88 by Solemn
Каким же образом из разных сеансов (фоновых заданий) получать временную таблицу созданную в родительском сеансе?
#89 by arsik
Через хранилище разве нельзя? И Запрос и МВТ
#90 by H A D G E H O G s
Только не в 8.3
#91 by H A D G E H O G s
Куски памяти, неважно.
#92 by H A D G E H O G s
Я не сомневался в тебе. Сжатие данных скорее всего сожмет эту строку deflate-ом.
#93 by Serginio1
Если это массив структур то можно взять и кусок памяти, так как они храняться все в одном непрерывном куске. Что касается объектов, то они разбросаны по всей памяти. Таблица типизирована, то можно записывать как в DBF для данных с определенным размером либо указывая размер данных в первых байтах например для строк. Либо записывать в аналог иерархической бд
#94 by H A D G E H O G s
Я не соглашусь с тобой. Имхается мне, что все объекты в 1С - связные списки (даже массивы и структуры) - нет падения скорости вставки на больших объемах.
#95 by К_Дач
Мегазадача... а если попробовать как-то получать из разных сеансов адрес ячеек в ОЗУ, занятых исходной таблицей (которую инициировал родительский сеанс)?
#96 by H A D G E H O G s
Аххх, если бы узнать адреса объектов 1С... мммм, какие возможности, но. Мечты. мечты.
#97 by Serginio1
Есть глобальные временные таблицы Временные таблицы Можно создавать локальные и глобальные временные таблицы.  Локальные временные таблицы видимы только во время текущего сеанса, а глобальные — во всех сеансах. Временные таблицы не подлежат секционированию. Имени локальной временной таблицы должен предшествовать знак номера (#table_name), а имени глобальной временной таблицы — двойной знак номера (##table_name).   Инструкции SQL могут обращаться к временной таблице по заданному в инструкции CREATE TABLE значению аргумента table_name, например:
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С