|
Сериализация объектов и недостаточно памяти | ☑ | ||
---|---|---|---|---|
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) Соответствующий ей набор данных как правило не лежит в одной таблице.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |