Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Raiser Гость
|
Добавлено: Вт Апр 11, 2006 2:59 pm Заголовок сообщения: Работа с объектами |
|
|
Написал программу, которая делает много операций над объектом, т.е. создает два полигона, относительно имеющейся в таблице полилинии (слева и справа), для всех объектов в данной таблице. При запуске программы MapInfo в памяти занимает около 18 Mb. В ходе выполнения размер постоянно увеличивается и программа выполняется все медленее. Есть предположение, что переменные типа Object остаются в памяти. Как этого избежать? |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Вт Апр 11, 2006 3:00 pm Заголовок сообщения: |
|
|
Скорее всего ошибка как обычно в 13-ой строке! :)
Программу-то на чем написал? Кусок кода можешь привести? А вообще можешь найти утечку так - выкидывай из программы часть кода, проверяй - утекает, еще выкидавай, перестало утекать - значит в этом месте, добавляешь код обратно, выкидываешь часть его и т.д. Типа методом половинного деления, так ты найдешь место которое выбирает память. Ну а дальше или сам поймешь что там делать или сюда обратишься. |
|
Вернуться к началу |
|
|
Raiser Гость
|
Добавлено: Вт Апр 11, 2006 3:01 pm Заголовок сообщения: |
|
|
Программу писал на MapBasic'е. Программу перелапатил от и до, но так и не нашел ошибку. Возможно объем памяти растет из-за следующих строк:
NObj=Combine(LObj, CreateLine(ObjectNodeX(LObj, 1, 1), ObjectNodeY(LObj, 1, 1),
ObjectNodeX(TObj, 1, ObjectInfo(TObj, OBJ_INFO_NPNTS)), ObjectNodeY(TObj, 1, ObjectInfo(TObj, OBJ_INFO_NPNTS))))
NObj=Combine(NObj, TObj)
NObj=Combine(NObj, CreateLine(ObjectNodeX(LObj, 1, ObjectInfo(LObj, OBJ_INFO_NPNTS)), ObjectNodeY(LObj, 1, ObjectInfo(LObj, OBJ_INFO_NPNTS)),
ObjectNodeX(TObj, 1, 1), ObjectNodeY(TObj, 1, 1)))
NObj=ConvertToRegion(NObj)
LObj=NObj |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Вт Апр 11, 2006 3:02 pm Заголовок сообщения: |
|
|
1. Попробуй создание объектов типа CreateLine(ObjectNodeX(LObj, 1, 1) внутрях процедуры Combine вынести в присвоение отдельным переменным. Т.е.:
ob1=CreateLine(ObjectNodeX(LObj, 1, 1)
NObj=Combine(LObj, ob1, ObjectNodeY(LObj, 1, 1),
ObjectNodeX(TObj, 1, ObjectInfo(TObj, OBJ_INFO_NPNTS)), ObjectNodeY(TObj, 1, ObjectInfo(TObj, OBJ_INFO_NPNTS))))
и т.д.
2. А потом эти объекты я понимаю вставляются в таблицу через Insert? И много таких вставок? Тысячи, десятки тысяч, более? Commit когда делаешь? После вставки всех объетов? Или почаще по ходу делай commit, или рассмотри возможность прямой вставки в таблицу, используя Set Table tablename FastEdit On |
|
Вернуться к началу |
|
|
|