Имя: Пароль:
1C
1С v8
Сериализация объектов и недостаточно памяти
0 Fragster
 
гуру
27.01.15
15:20
Есть велосипедная система версионирования, пишущая сериализованные объекты в РС, все работало, пока не попался уж больно большой объект.

    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Источник);
////////////// тут падает >
    XML = Запись.Закрыть();
////////////// < тут падает
    
    Запись = РегистрыСведений.ИсторияИзмененийXML_ПодчиненныеРегистры.СоздатьМенеджерЗаписи();
    Запись.Период = ТекущаяДата();
    Запись.СсылкаНаРегистратор = Источник.Отбор.Регистратор.Значение;
    Запись.Метаданные = ПолноеИмяМетаданных;
    Запись.Действие = ?(Источник.Количество() = 0, Перечисления.ИсторияОбъектовДействия.Удаление, Перечисления.ИсторияОбъектовДействия.Изменение);
    Запись.УникальныйИдентификатор = Новый УникальныйИдентификатор;
    Запись.ХранилищеXML = Новый ХранилищеЗначения(XML, Новый СжатиеДанных(9));
    Запись.АвторИзменений = ПараметрыСеанса.Сотрудник;
    Запись.ИмяКомпьютера = ИмяКомпьютера();
    Запись.ИнформационнаяБаза = ПараметрыСеанса.ИБЭтогоУзла;
    Запись.Записать();

как бы обойти?
1 Fragster
 
гуру
27.01.15
15:22
кстати, вылетает на 32битном клиенте, так как куча файловых баз. на 64битном сервере вроде ОК.
2 Fragster
 
гуру
27.01.15
15:22
в смысле, перевесит всех на клиент-сервер - не предлагать :)
3 ДенисЧ
 
27.01.15
15:23
на сервере выгружай. В чём проблема?
или руками сериализацию пиши
4 Fragster
 
гуру
27.01.15
15:24
(3)->(2)
5 Fragster
 
гуру
27.01.15
15:24
руками сериализация кушает памяти намного больше, не?
6 Fragster
 
гуру
27.01.15
15:24
и времени занимает сильно больше
7 H A D G E H O G s
 
27.01.15
15:30
(0) Никак. У тебя в области памяти процесса нет непрерывного свободного блока на 100500 мегабайт.
Пеши в файл.
8 Fragster
 
гуру
27.01.15
15:33
(7) а потом что? надо ж в РС сохранить...
9 SUA
 
27.01.15
15:33
(0)вам не нужны версии настолько больших объектов
10 H A D G E H O G s
 
27.01.15
15:38
(8)

ДвоичныеДанные=Новый ДвоичныеДанные(КаталогФайловXML+НовСтр.ИмяФайла);

НовСтр.СжатыйТекст = Новый ХранилищеЗначения(ДвоичныеДанные,Новый СжатиеДанных(9));
11 Fragster
 
гуру
27.01.15
16:28
записьfastinfoset походу сильно меньше памяти жрет
12 H A D G E H O G s
 
27.01.15
16:28
(11) Только это будет двоичный формат
13 H A D G E H O G s
 
27.01.15
16:29
(11) Который, к тому же, недоступен на Тонком клиенте.

Все это я узнал, когда занимался оптимизацией передачи данных с сервера на клиент.
14 Fragster
 
гуру
27.01.15
16:36
(11)+ кому интересно: http://wstaw.org/m/2015/01/27/0.png
15 Garykom
 
гуру
27.01.15
16:40
Объясните зачем раздувать рабочую базу за счет хранения разных версий? Или у Вас это документооборот?
16 Fragster
 
гуру
27.01.15
16:41
(15) чтобы можно было вернуться к предыдущему состоянию объекта, а также надавать по шапке тому, кто поменял что не надо.
17 Garykom
 
гуру
27.01.15
16:43
(16) это понятно, а зачем это хранить в рабочей базе? почему не отдельно от базы актуальной?
18 Fragster
 
гуру
27.01.15
16:45
(17) например из-за того, что РИБ, и история должна как-то прилететь в центр, откуда оно, например, улетит в архивную базу...
19 Garykom
 
гуру
27.01.15
16:49
(18) офигеть еще и РИБ ;)

но смысл понятен, хотя сделал бы отдельный лисапед для логирования действий/состояний объектов

тупо перед/после записи объектов на диск/в отдельную базу бы их писал )) а не в рабочую базу чтоб не пухла, но тут от объемов конечно

можно и в рабочую и периодически чистить с выгрузкой
20 H A D G E H O G s
 
27.01.15
16:50
(15) Чем мешает раздувание базы?
21 Garykom
 
гуру
27.01.15
16:55
(20) да ничем собственно, кроме некоторых (легких) тормозов со временем и/или необходимостью обновлять сервак (диски для рейд немного кусаются)
22 Fragster
 
гуру
27.01.15
16:56
(20) да ничем оно не мешает. сейчас давайте подумаем над тем, что лучше в данном контексте: XML через временный файл или FastInfoSet?
23 Garykom
 
гуру
27.01.15
16:59
(22) двоичные данные (сжатые) лучше, imho
24 H A D G E H O G s
 
27.01.15
17:01
(22) FastInfoSet через временный файл, ибо и с FastInfoSet -ом со временем напорешься.
25 H A D G E H O G s
 
27.01.15
17:02
Хотяяя, если время создания не критично - лучше XML, чтобы можно было разобрать руками, еслифчо.
26 Garykom
 
гуру
27.01.15
17:03
(22)(24) гыгы

а раз один фиг пишем из базы на диск во временный файл, то зачем потом тратить время на чтение назад в базу?

не лучше ли отдельное что то будет читать и грузить к себе эти файлы ))
27 Fragster
 
гуру
27.01.15
17:39
да, через файл выгружается подольше, но зато память не растет ВООБЩЕ
28 tridog
 
27.01.15
17:41
(20) Ограничением на размер таблицы в файловой базе? :)
29 Fragster
 
гуру
27.01.15
17:43
(28) одна запись    
Запись.ХранилищеXML = Новый ХранилищеЗначения(XML, Новый СжатиеДанных(9));
как правило занимает намного меньше места, чем соответствующий её набор данных
30 Fragster
 
гуру
27.01.15
17:51
вот еще вопрос: для вынимания из транзакции хотелось сделать передачей XML в фоновое задание. с файлом - можно передавать имя файла, что даже проще. Но тогда остается вопрос с тем, как отловить отвалившуюся транзакцию, например из-за срабатывания Отказ = истина в ОбработкаПроведения или отката по блокировкам*
31 Fragster
 
гуру
27.01.15
17:51
?
32 H A D G E H O G s
 
27.01.15
17:54
(30) щта?
33 Garykom
 
гуру
27.01.15
17:56
(30) дык вот не пофиг что не провелось, один фиг пишем же что записалось, ну будут дубли не измененных записей
34 Дык ё
 
27.01.15
18:01
(30) пиши в той же транзакции подпиской в отдельную очередь (рс, справочник) только ссылки, а фоновым разгребай ссылки и сериализуй. попадешь на race condition - приходи еще :)
35 H A D G E H O G s
 
27.01.15
18:02
Понял.

Я бы в ОбработкеПроведения документа писал бы в служебный регистр вида

Измерения:
ДокументСсылка,
УжеЗаархивировано

Все. Легко и просто.

Фоновые задания ходили бы по этому регистру, вытаскивали незаархивированные и архивировали.

При этом ставя исключительную блокировку на весь диапазон ДокументСсылка.
36 H A D G E H O G s
 
27.01.15
18:04
1 проведение выполняется без всей этой архивной фигни.
но есть вариант пропустить версию.

Поэтому либо пропустить эту версию, либо ждать, пока документ будет заархивирован фоновыми.
37 H A D G E H O G s
 
27.01.15
18:04
(36) + при повторном проведении
38 H A D G E H O G s
 
27.01.15
18:05
Если же будет откат транзакции на 1 проведении - не будет записи в регистре и все ок.
39 Garykom
 
гуру
27.01.15
18:09
Кста а пишем то значения новые (сразу после записи. в т.ч. для новых объектов, старые один раз при внедрении фишки) или старые до записи?
40 Fragster
 
гуру
27.01.15
18:31
При архивировании база не читается.
(36) у меня сейчас сохраняется всё - документы, справочники, движения, независимые регистры.

потом дедупликация, отчеты о сравнении всякие, кнопка отката к предыдущему состоянию и т.п.
41 tridog
 
27.01.15
21:01
(29) Соответствующий ей набор данных как правило не лежит в одной таблице.
Программист всегда исправляет последнюю ошибку.