Выполняю, примерно, такой код в процедуре:
Док=ХХ.СоздатьДокумент();
Уз1=Док.СоздатьПодчиненныйЭлемент("Уз1");
Уз1.УстановитьАтрибут("...");
Уз2=Уз1.СоздатьПодчиненныйЭлемент("Уз2");
Уз2.УстановитьАтрибут("...");
......................................
Док.Записать("Док.xml"); Процедура используется в цикле для создания сотни разных файлов.
При создании каждого XML-документа занимается около 200 МБ оперативной памяти.
И, естественно, не освобождается. ;-)
Существует ли метод удаления "объекта" Док из оперативной памяти?
(4)
Такое, естественно, не освобождает память. :-(
(5)
Ответ дан в (6) сообщении.
(6)
И такое - не помогает. :-(
Пока, вижу единственный способ:
Обходить дерево XML-документа "от листьев" и удалять каждый узел методом УдалитьПодчиненный(). Муторно эТТо делать... ;-)
(8)
Для "последовательных" документов можно всё сделать и через обычный текстовый файл. ;-)
Для простых и особо критичных алгоритмов - так и делаю. Без всяких XML-ев и внешних компонент - ручками. :-)
Но, в текущей задаче требуется выгружать иерархическую структуру (дерево). Делаю рекурсивный обход дерева. И последовательное создание XML-документа не получается простым способом. :-(
XX - это COMObject почитайте про жизненный цикл COM объектов и поймете, что пытаться убить отдельный экземпляр бессмысленно. Нужно убивать все связанные объекты. Т.е. объект живет пока на него есть ссылки. Т.о. исходя из примера:
(11)
"У автора темы вообще-то 1С 7.7"(с) Мне представляется, что это без разницы. ;-)
Если используется "Библиотека MS XML Parser".
Я, вообще, не нашел команды (метода) очистки памяти.
А если удалять "верхние" узлы (до выгрузки в файл), то они удаляются со всеми подчиненным, и в файл записывается желаемый результат. А память не освобождается.
Или я чего НеДоЧиталНеДоПонял...
(11)(10)(6)(2)
Проблем решена. Всем спасибо за участие в теме форума!
Переписал на "прямое" использование "Msxml2.DOMDocument" без V7Plus.
Память занимается в пять раз меньше. Скорость работы в три раза выше.
Но, после записи в файл и выхода из процедуры (и из внешней обработки) память не освобождается. Она освобождается при повторном запуске алгоритма. Т.е., если при использовании V7Plus занятость памяти нарастала, то теперь при каждом вызове процедура она освобождается, и занимается на тот же размер заново.
Для полного освобождения памяти достаточно выполнить:
Parser.removeChild(Корень);
Parser.appendChild(Parser.createElement("Фиктивный"));
При этом способе утечка памяти минимальна... ;-)
если в процедуре использовать все локальные переменные
и не привязывать их к глобальным т.е. нужно создавать объект в процедуре и производить поиск этих глобальных объектов, то при выходе из процедуры память должна освобождаться
(14)
"если в процедуре...память должна освобождаться"(с) Должна. В некоторых других алгоритмах, реализованных с применением V7Plus, память освобождается. Видимо в "проблемном" алгоритме мне удалось "наехать" на некоторые нюансы данной внешней компоненты. Но, повторю. После тупой замены методов V7Plus на "прямое" использование "Msxml2.DOMDocument" проблема с освобождением памяти исчезла. Вроде, я понял почему это произошло. Но, простыми словами описать это не берусь. ;-) А грузить сообщество полным текстом своей программы не считаю возможным...