Вопрос к "удачникам"(с) - специалистам по XML. ;-)

1. hogik 443 16.08.12 18:54 Сейчас в теме
Выполняю, примерно, такой код в процедуре:
Док=ХХ.СоздатьДокумент();
Уз1=Док.СоздатьПодчиненныйЭлемент("Уз1");
Уз1.УстановитьАтрибут("...");
Уз2=Уз1.СоздатьПодчиненныйЭлемент("Уз2");
Уз2.УстановитьАтрибут("...");
......................................
Док.Записать("Док.xml");

Процедура используется в цикле для создания сотни разных файлов.
При создании каждого XML-документа занимается около 200 МБ оперативной памяти.
И, естественно, не освобождается. ;-)
Существует ли метод удаления "объекта" Док из оперативной памяти?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ZOMI 141 16.08.12 19:21 Сейчас в теме
......................................
Док.Записать("Док.xml");
Док = "";
Не ?
3. hogik 443 16.08.12 22:04 Сейчас в теме
4. KapasMordorov 428 17.08.12 10:26 Сейчас в теме
Ну вроде так:
В FormEx и 1С++ если метод Сервис::ВыгрузитьВнешнююКомпоненту(). (С) Альф
7. hogik 443 17.08.12 15:58 Сейчас в теме
(4)
Такое, естественно, не освобождает память. :-(
(5)
Ответ дан в (6) сообщении.
(6)
И такое - не помогает. :-(
Пока, вижу единственный способ:
Обходить дерево XML-документа "от листьев" и удалять каждый узел методом УдалитьПодчиненный(). Муторно эТТо делать... ;-)
8. KapasMordorov 428 17.08.12 16:22 Сейчас в теме
(7)
http://www.forum.mista.ru/topic.php?id=218450
ПоследовательноЗаписываемыйДокумент = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент();
9. hogik 443 17.08.12 17:13 Сейчас в теме
(8)
Для "последовательных" документов можно всё сделать и через обычный текстовый файл. ;-)
Для простых и особо критичных алгоритмов - так и делаю. Без всяких XML-ев и внешних компонент - ручками. :-)
Но, в текущей задаче требуется выгружать иерархическую структуру (дерево). Делаю рекурсивный обход дерева. И последовательное создание XML-документа не получается простым способом. :-(
5. IvanSusanin 17.08.12 14:13 Сейчас в теме
что такое ХХ в строке Док=ХХ.СоздатьДокумент(); ?
6. пользователь 17.08.12 15:15
XX - это COMObject почитайте про жизненный цикл COM объектов и поймете, что пытаться убить отдельный экземпляр бессмысленно. Нужно убивать все связанные объекты. Т.е. объект живет пока на него есть ссылки. Т.о. исходя из примера:
Уз1=Неопределено;
Уз2=Неопределено;
Док=Неопределено;
ХХ=Неопределено;
10. IvanSusanin 20.08.12 12:50 Сейчас в теме
(6) bomba,

я спрашивал потому что мы формируем хмл не внешней компонентой, а вот таким образом:

ЗаписьХМЛ = Новый ЗаписьXML;
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
ЗаписьХМЛ.ОткрытьФайл( ИмяФайла, "windows-1251");
ЗаписьХМЛ.ЗаписатьОбъявлениеXML();

ЗаписьХМЛ.ЗаписатьНачалоЭлемента("SWIFT_msg_fields");
ЗаписьХМЛ.ЗаписатьТекст("Привет");
ЗаписьХМЛ.ЗаписатьКонецЭлемента(); // </SWIFT_msg_fields>

ЗаписьХМЛ.Закрыть();
ЗаписьХМЛ = "";

И у нас проблем с памятью нет.
Но это задача по генерации самого хмл файла и не касается планов обмена и т.д.
alex-l19041; +1 Ответить
11. KapasMordorov 428 20.08.12 18:40 Сейчас в теме
У автора темы вообще-то 1С 7.7.
А ему про "ЗаписьXML" и "Неопределено" пишут.
12. hogik 443 20.08.12 19:13 Сейчас в теме
(11)
"У автора темы вообще-то 1С 7.7"(с)
Мне представляется, что это без разницы. ;-)
Если используется "Библиотека MS XML Parser".
Я, вообще, не нашел команды (метода) очистки памяти.
А если удалять "верхние" узлы (до выгрузки в файл), то они удаляются со всеми подчиненным, и в файл записывается желаемый результат. А память не освобождается.
Или я чего НеДоЧиталНеДоПонял...
13. hogik 443 21.08.12 00:08 Сейчас в теме
(11)(10)(6)(2)
Проблем решена. Всем спасибо за участие в теме форума!
Переписал на "прямое" использование "Msxml2.DOMDocument" без V7Plus.
Память занимается в пять раз меньше. Скорость работы в три раза выше.
Но, после записи в файл и выхода из процедуры (и из внешней обработки) память не освобождается. Она освобождается при повторном запуске алгоритма. Т.е., если при использовании V7Plus занятость памяти нарастала, то теперь при каждом вызове процедура она освобождается, и занимается на тот же размер заново.
Для полного освобождения памяти достаточно выполнить:
Parser.removeChild(Корень);
Parser.appendChild(Parser.createElement("Фиктивный"));
При этом способе утечка памяти минимальна... ;-)
17. andrewks 1375 02.11.12 18:54 Сейчас в теме
(13) hogik, что-то поздненько ты на прямую работу с msxml перешёл. скоро уж 7.7 загнётся, а 8-ка полностью на линукс перейдёт ;-)

если серьёзно - уже 3 года как юзаю напрямки, доволен, как слон. теперь везде рассказываю про ужасную глюкавость v7plus.dll
18. hogik 443 02.11.12 19:34 Сейчас в теме
(17)
"скоро уж 7.7 загнётся"(с)
В моём случае - скорее я сам загнусь. :-(
19. Antoska 16 21.12.20 11:39 Сейчас в теме
(18)Привет вам из ковидного 2020-го. Пользуемся 77. Как ваше здоровье?
14. cotnar 02.11.12 16:43 Сейчас в теме
если в процедуре использовать все локальные переменные
и не привязывать их к глобальным т.е. нужно создавать объект в процедуре и производить поиск этих глобальных объектов, то при выходе из процедуры память должна освобождаться
Процедура Выгрузка(Об)
Перем Док,Спр;
Спр=СоздатьОбъект("...")
Спр.Найти(Об);
Док=ХХ.СоздатьДокумент();
Уз1.УстановитьАтрибут(Спр.ТекущийЭлемент());
КонецПроцедуры

Выгрузка(Константа.БазСклад);
Показать
15. hogik 443 02.11.12 18:01 Сейчас в теме
(14)
"если в процедуре...память должна освобождаться"(с)
Должна. В некоторых других алгоритмах, реализованных с применением V7Plus, память освобождается. Видимо в "проблемном" алгоритме мне удалось "наехать" на некоторые нюансы данной внешней компоненты. Но, повторю. После тупой замены методов V7Plus на "прямое" использование "Msxml2.DOMDocument" проблема с освобождением памяти исчезла. Вроде, я понял почему это произошло. Но, простыми словами описать это не берусь. ;-) А грузить сообщество полным текстом своей программы не считаю возможным...
16. andrewks 1375 02.11.12 18:51 Сейчас в теме
(14) cotnar, думаю, это зависит от менеджера памяти. не факт, что он запустить очистку сию наносекунду, как только закрыли обработку
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот