Имя: Пароль:
1C
1С v8
Сжатие данных версионирования
0 Maxus43
 
05.03.13
15:08
Приветствую!
В типовой УПП есть код, суть проста - сжимает данные в версионировании.

   Запрос = Новый Запрос;
   
   Запрос.Текст = "ВЫБРАТЬ Объект,  НомерВерсии, ВерсияОбъекта
                   | ИЗ РегистрСведений.ВерсииОбъектов
                   | ГДЕ УдалитьСжато = Ложь";
   
   Выборка = Запрос.Выполнить().Выбрать();
   
   Пока Выборка.Следующий() Цикл
       
       ДвоичныеДанные  = Выборка.ВерсияОбъекта.Получить();
       ХранилищеДанных = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
       
       МенеджерЗаписиВерсииОбъектов = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
       
       МенеджерЗаписиВерсииОбъектов.Объект        = Выборка.Объект;
       МенеджерЗаписиВерсииОбъектов.НомерВерсии   = Выборка.НомерВерсии;
       
       МенеджерЗаписиВерсииОбъектов.Прочитать();
       МенеджерЗаписиВерсииОбъектов.ВерсияОбъекта = ХранилищеДанных;
       МенеджерЗаписиВерсииОбъектов.УдалитьСжато  = Истина;
       МенеджерЗаписиВерсииОбъектов.Записать();
       
   КонецЦикла;

Вопрос - почему именно в запросе вытягивает поле ВерсияОбъекта, т.е. само хранилище значения?
Ведь если переделать:
....
       МенеджерЗаписиВерсииОбъектов.Прочитать();
       ДвоичныеДанные  = МенеджерЗаписиВерсииОбъектов.ВерсияОбъекта.Получить();
       ХранилищеДанных = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
....
то не надо будет тянуть в запросе.
Дело вобще в том, что данный код "справляется" только с небольшими объёмами. Например вытянуть 500 тысяч несжатых записей уже валится.
С доработкой - ему будет без разницы на объём.
Почему именно так сделано? есть тайный смысл?
1 ДенисЧ
 
05.03.13
15:11
А зачем регламенту тянуть 500000 записей?
Он в теории каждую нощь должон проходить.
2 H A D G E H O G s
 
05.03.13
15:13
Пока Истина Цикл

Выбрать Первые 500
3 Fragster
 
гуру
05.03.13
15:13
на самом деле надо хранить отдельно метаданные версий, отдельно хранилище с массивом со всеми версиями - тогда оно будет сжато намного эффективнее, чем если много отдельных хранилищ
4 Fragster
 
гуру
05.03.13
15:14
правда тогда надо распаковывать все версии когда одну надо получить...
5 Живой Ископаемый
 
05.03.13
15:14
этот регистр по-моему специально таким стремным сделан, у меня например большие сомнения в том что стоило датуверсии реквизитом а не измерением, тем более без индекса
6 Maxus43
 
05.03.13
15:40
Это всё вы правильно, меня интересует сам Запрос, ну нахрена тянуть в нём хранилище значения? Если ниже всё равно есть конструкция Прочитать() - по сути и подтягивает хранилище
7 Maxus43
 
05.03.13
15:41
на больших объёмах данных сказывается, запрос очень долго выполняется, да и падает если совсем невмоготу
8 Maxus43
 
05.03.13
15:42
(2) Как оптимизировать - понятно... ну это же типовое)
9 Maxus43
 
05.03.13
15:44
(1) в этом и трабл. Регл задание было ограничено по времени, а т.к. запрос выполняется Долго из-за этого ненужного там поля - не всё успевал сжать, в итоге за полгода скопилось
10 Maxus43
 
05.03.13
15:47
Может я неправильный какой-то, но щетаю что код должен работать с учетом всяких форсмажоров, а не придерживаясь принципа "ну должно же быть меньше данных".
Ошибку кто в запросе видит? или это специально сделано? тянуть хранилище значений
11 Fragster
 
гуру
05.03.13
15:48
(10) ну ладно, переделай у себя.
12 H A D G E H O G s
 
05.03.13
15:51
(10) Я не вижу
13 H A D G E H O G s
 
05.03.13
15:52
(3) Ну можно диапазонами сделать.
14 H A D G E H O G s
 
05.03.13
15:54
(3) А вообще - попробуйте новый файл в архив ZIP добавить - он его с нуля пересожмет, так как ему словарь надо обновить и нужен цельный поток.
15 Maxus43
 
05.03.13
15:55
(12) может понимаешь глубинный смысл дёргать хранилище запросом? учитывая что ниже всё равно идёт чтение менеджера записей, и де факто чтение этого самого хранилища?
16 Fragster
 
гуру
05.03.13
15:56
(14) да, но 10 похожих XML очень похожи на 1 XML в архиве
17 Maxus43
 
05.03.13
15:56
(16) эт логично, учитывая алгоритмы сжатия и внутренности XML
18 Fragster
 
гуру
05.03.13
15:57
(17) соответственно, 100 версий от одной  не сильно должны отличаться по размеру, когда они в одном архиве.
19 Maxus43
 
05.03.13
16:00
(18) как делить общее хранилище будешь на независимые объекты для сериализации? хранить в хранилище структуру объектов?
20 H A D G E H O G s
 
05.03.13
16:01
(15) А, все, вижу.
21 Maxus43
 
05.03.13
16:03
(20) самое обидное что эта хрень в разы замендляет запрос.
Понятно что ноги растут из-за того что "не следили за базой" в версионировании, но ошибка логическая в коде помойму очевидна....
22 Fragster
 
гуру
05.03.13
16:03
(19) добавить пакет
23 Fragster
 
гуру
05.03.13
16:03
XDTO
24 H A D G E H O G s
 
05.03.13
16:04
(23) Тоесть?
25 Maxus43
 
05.03.13
16:05
(24) в одном пакете можно хранить несколько объектов
26 Maxus43
 
05.03.13
16:06
хотя хз, надо проверять...)
27 H A D G E H O G s
 
05.03.13
16:06
(25) Ну я и говорю, диапазоны.
28 Fragster
 
гуру
05.03.13
16:11
Элемент с реквизитом типа anyType и maxOccurs unbounded, храни сколько хочешь чего хочешь
29 Fragster
 
гуру
05.03.13
16:11
единственное, при изменении структуры метаданных - будет косяк
30 olegves
 
05.03.13
16:14
(21) я себе допилил сохранение версии, очищая значения для полей с типом ХЗ. Все одно эти значения не сравниваются при сравнении версий