Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 22:03

Утечка памяти при использовании Native API

Автор PowerLord, 20 фев 2013, 03:26

0 Пользователей и 1 гость просматривают эту тему.

PowerLord

Всем привет.
Я использую внешнюю компоненту, написанную на С++.
При вызове процедур и функций этой библиотеки происходит утечка памяти! для примера вызывал процедуру, в которой ничего не происходило - и всё равно была утечка. за 1000000 вызовов около 30 метров оперативки захватывается 1С :(
У кого нибудь была такая проблема?
Мне требуется написать функцию, которая будет вызываться очень много раз, поэтому это очень критично.

Yura063

Тут вам не кто не поможет так как такой библиотеки не у кого нет! тут вам помогут с написание процедур и функций! А если так беспокоитесь о памяти то может стоит ее увеличить?
Помогли, отблагодари!

PowerLord

ЦитироватьТут вам не кто не поможет так как такой библиотеки не у кого нет! тут вам помогут с написание процедур и функций! А если так беспокоитесь о памяти то может стоит ее увеличить?

Вообще то я интересовался, не было ли у кого-нибудь похожих ситуаций, связанных с использованием библиотек, написанных по технологии Native API.

Зря вы считаете что увеличение памяти решит все проблемы, связанные с её утечкой.
При 100000000 обращений к библиотечной функции у меня 1С вылетела с ошибкой нехватки памяти (4 гб оперативки)!

Если вы знаете где могут помочь, дайте ссылку.

Dethmontt

Как вы ее вызываете в 1С ?
Добавлено: 20 фев 2013, 09:56


Функцию из библиотеки
Добавлено: 20 фев 2013, 09:57


Покажите полный код -
инициализацию библиотеки
Вызов функции
Завершение работы модуля
Добавлено: 20 фев 2013, 10:02


Есть 2 предположения почему течет память у 1С
1. Избыточный вызов конструктора объекта(и не используется деструктор)
2. СТЕК 1С
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

PowerLord

ЦитироватьКак вы ее вызываете в 1С ?

Если ПодключитьВнешнююКомпоненту("ОбщийМакет.AddInNative", "Comp") Тогда
Попытка
глAddInNative = Новый("AddIn.Comp.AddInNativeExtension");
Исключение
Сообщить("Фейл");
КонецПопытки;
КонецЕсли;

ТаймерСтарт = глAddInNative.Milliseconds;
Для Счетчик = 1 По 100000 Цикл
глAddInNative.Sleep(1);
Сообщить(Счетчик);
КонецЦикла;
ТаймерСтоп = глAddInNative.Milliseconds;
глAddInNative = Неопределено;
Сообщить("Затрачено времени С++: " + (ТаймерСтоп - ТаймерСтарт));

Функция Sleep отправляет 1С "спать"на 1 миллисекунду.
Milliseconds - текущее системное время до миллисекунд. вроде

Dethmontt

Супер. Думаю в такой реализации проблем с утечкой у вас не возникнет.

Как вы организовали 1000000 вызовов?

Просто запустив это в цикле?
глAddInNative = глПеременные.AddInNative();
    Если глAddInNative = Неопределено Тогда Возврат КонецЕсли;
    глAddInNative.Sleep(Задержка);
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

PowerLord

Я упростил код и выложил в предыдущем сообщении новый. просто там я не весь показал, подумал, вдруг там что-то левое было что могло память поесть, и написал заново.

Цитировать
Как вы организовали 1000000 вызовов?

Просто запустив это в цикле?
именно так
Добавлено: 20 фев 2013, 10:27


ЦитироватьСупер. Думаю в такой реализации проблем с утечкой у вас не возникнет.

Так возникают ведь :dfbbdrfb:
вчера около 4-х метров памяти терялось, сегодня уже 15. на 100000 вызовов
Добавлено: 20 фев 2013, 10:30


Dethmontt, вы не знаете, можно ли как-либо "помочь" 1С освободить память?

Dethmontt

А если из ЦИКЛА убрать?
Сообщить(Счетчик);
Добавлено: 20 фев 2013, 10:35


А вы не думали в сторону чтобы сократить количество вызовов?
Добавлено: 20 фев 2013, 10:37


На вот такую реализацию у меня затратилось больше 100 Мб памяти
Для Сч=1 По 1000000 Цикл
Сообщить(Сч);
КонецЦикла;
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Dethmontt

Цитата: PowerLord от 20 фев 2013, 10:25Dethmontt, вы не знаете, можно ли как-либо "помочь" 1С освободить память?
1С делает это сама.
Как только модуль отработает все его переменные (не глобальные) будут очищены
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

PowerLord

ЦитироватьА если из ЦИКЛА убрать?
Сообщить(Счетчик);

Это я вывел чтобы видеть процесс выполнения. без него память тоже пропадает

ЦитироватьА вы не думали в сторону чтобы сократить количество вызовов?
нельзя. Здесь, собственно, я привел функцию, никак не оперирующую памятью вне 1С. А нужно написать функцию, обрабатывающую строку (в 1С обработка строки, аналогичная обработке в С++, работала на 25% дольше чем в С++). а таких строк в центральной базе крупного предприятия ооочень много
Добавлено: 20 фев 2013, 10:49


ЦитироватьНа вот такую реализацию у меня затратилось больше 100 Мб памяти
эх, криворукие разработчики 1С.

Dethmontt, а вы сами писали AddInNative внешние компоненты?

Похожие темы (5)

Рейтинг@Mail.ru

Поиск