Как освободить память после пересчёта Clash

Программирование для CATIA.

Как освободить память после пересчёта Clash

Сообщение VladimirK » 26 апр 2012 19:32

Здравствуйте! В процессе работы возникла следующая задача: в сборке имеется деталь, содержащая замкнутую поверхность; в эту сборку вставляется деталь параллелепипеда (на рисунке ниже схематично изображено сечение). По циклу параллелепипед перемещается в плоскости XY вдоль направляющей линии с малым шагом delta = 1-10 мм. После каждого перемещения просчитывается пересечение параллелепипеда с поверхностью с помощью метода Compute() объекта Clash (часть кода приведена ниже). Проблема состоит в том, что таких перемещений и вызовов Clash.Compute() десятки-сотни тысяч. В цикле новые объекты не создаются, только перемещается параллелепипед и вызывается метод Clash.Compute(), но после пересчёта Clash.Compute() постоянно увеличивается объём оперативной памяти, выделяемый процессом CATIA.exe, достигая нескольких гигабайт или CATIA вовсе "вылетает". Каким образом можно освобождать память после выполнения каждой итерации пересчёта Clash.Compute(), без закрытия докумета сборки?

Код: Выделить всё
Dim ProdClashes As SPATypeLib.Clashes
Dim ProdClash As SPATypeLib.Clash
Dim cGroups As NavigatorTypeLib.Groups
Dim group1 As NavigatorTypeLib.Group
Dim group2 As NavigatorTypeLib.Group
Dim i As Long
Dim n as Long
Dim QPos(11)
' .....
' заполнение QPos(11) начальными значениями
' .....
n = 1
Set ProdClashes = Prod.GetTechnologicalObject("Clashes")
Set ProdClash = ProdClashes.Add
ProdClash.ComputationType = catClashComputationTypeBetweenTwo
ProdClash.InterferenceType = catClashInterferenceTypeContact
Set cGroups = Prod.GetTechnologicalObject("Groups")
Set group1 = cGroups.Add
Set group2 = cGroups.Add

group1.AddExplicit SurfaceProd   ' поверхность
ProdClash.FirstGroup = group1

RootProducts.AddComponentsFromFiles QuadFile, "All"
Set QuadProd = RootProducts.Item(n)   ' параллелепипед
group2.AddExplicit QuadProd
ProdClash.SecondGroup = group2

For i = 1 To 10000
   QuadProd.Position.SetComponents QPos
   ProdClash.Compute ' после пересчёта CATIA выделяет оперативную память
   ' .....
   ' проверяются условия, изменяется координата QPos
   ' новые объекты в цикле не создаются
   ' .....
Next i
Вложения
Clash.png
Clash.png (11.42 КБ) Просмотров: 8908
Последний раз редактировалось VladimirK 04 май 2012 10:08, всего редактировалось 1 раз.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

Re: Как освободить память после пересчёта Clash

Сообщение Wireless_Fidelity » 27 апр 2012 04:29

Здравствуйте.
Какой релиз? Пробовали пересоздавать клэш в каждой итерации?
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Как освободить память после пересчёта Clash

Сообщение likemilk » 27 апр 2012 16:40

Тоже есть проблема с памятью. Но тока при обработке за один раз нескольких сотен документов. Документы открываются (по очереди), выгружаются данные, документ закрывается, но память после закрытия документа не высвобождается, а только уменьшается.
Может есть команда какая специальная? Которую можно было бы вызывать после завершения каждой итерации цикла.
likemilk
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 02 дек 2008 15:23

Re: Как освободить память после пересчёта Clash

Сообщение Wireless_Fidelity » 27 апр 2012 17:23

Такой команды нет. CATIA должна сама эту память освобождать, но делает она это крайне плохо. Берите 64-битную машину с 8, 12, 16Гб памяти, запускайте прожорливые скрипты в режиме батча.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Как освободить память после пересчёта Clash

Сообщение VladimirK » 27 апр 2012 18:35

Здравствуйте. Тестировал в CATIA V5R16 и V5R19, на 32-битном, 64-битном ПК.
Объект Clash в первоначальной версии создавался один вне цикла, а потом в цикле лишь пересчитывался вызовом метода Compute().
Сегодня сделал создание Clash внутри цикла, потом пересчёт Clash.Compute(), а в конце итерации удаление клэша, но все равно объём выделяемой оперативной памяти так же увеличивается.
Код: Выделить всё
For i = 1 to 10000
' .....
  ProdClashes.Remove (1)
Next i
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

Re: Как освободить память после пересчёта Clash

Сообщение Wireless_Fidelity » 27 апр 2012 18:49

Если считать вручную, проблемы не возникает? Если так, то попробуйте обновлять клэш не через Compute, а через какую-нибудь StartCommand "Update".

Для R19 есть девятый сервис-пак. Установите, вдруг поможет.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Как освободить память после пересчёта Clash

Сообщение VladimirK » 04 май 2012 10:07

Вручную команда отрабатывает, но память при этом тоже чуть-чуть, но выделяется. Просто в цикле очень большое количество пересчётов Clash и освобождение памяти не происходит. Сейчас пока думаю над алгоритмом, чтобы не выполнять такое большое количество пересчётов. Спасибо за помощь.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

Re: Как освободить память после пересчёта Clash

Сообщение Wireless_Fidelity » 04 май 2012 12:25

Если вычислений действительно так много, то есть смысл разбить вычисления на несколько частей, каждую из которых выполнять скриптом в батче. Результаты при этом писать в единый файл.
При таком подходе скрипт запускается в отдельном процессе CNEXT, который завершается автоматически по окончании кода скрипта. Таким образом, память контролируется на уровне операционной системы.

Пожалуйста, отпишитесь, когда выберете решение. Вопрос обработки большого количества данных в CATIA мне интересен.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Как освободить память после пересчёта Clash

Сообщение VladimirK » 14 янв 2013 17:05

Здравствуйте. После перерыва вернулись к этой задаче.
Проблему удалось решить следующим образом:
Приложение, написанное на VB6, cначала загружает сборку в CATIA, производятся необходимые измерения, сборка выгружается. Потом генерируется скрипт (*.CATScript), по циклу пересчитывающий Clash и запускается в пакетном режиме. Благодаря этому скорость работы возросла в несколько раз, но памяти выделялось как и раньше. Освободить память удалось периодическим переводом сборки в режим визуализации (Product.ApplyWorkMode VISUALIZATION_MODE). Несмотря на то, что работа велась в пакетном режиме, это помогло.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2