Асаd 2007 жрет память в методе SetXData. Как решить?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Асаd 2007 жрет память в методе SetXData. Как решить?

Асаd 2007 жрет память в методе SetXData. Как решить?

Ответ
Поиск в этой теме
Непрочитано 14.08.2009, 01:02 #1
Асаd 2007 жрет память в методе SetXData. Как решить?
parkovaya1
 
Регистрация: 14.08.2009
Сообщений: 10

В методе SetXData при многократном выполнении приложение acad.exe очень интенсивно кушает память (смотрю через диспетчер задач виндовз)
Так при 10000 выполнений метода и массиве записываемых данных представленном ниже объем занимаемой приложением памяти увеличивается на 3.5 Мб.
причем, как видно, записываются одни и те же данные в один и тот же объект.

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

В целевой программе такая запись производится многократно, в результате память системы (4Гб) заканчивается раньше, чем выполнение программы.
С какой стороны подойти к решению этой проблемы вобще не понимаю. Посоветуйте, пожалуйста....


Вот кот (большая часть его вспомогательная, проблемная строка выделена восклицательными знаками, процедура самодостаточна и будет работать при вставке в новый документ):

Код:
[Выделить все]
Sub УтечкаПамяти()
    
    Dim Dic As AcadDictionary
    Dim XRec As AcadXRecord
    Dim xtypeOut, xdataOut As Variant
    
    On Error GoTo CreateDic
    Set Dic = ThisDrawing.Dictionaries("СловарьЗаписей")
    On Error GoTo CreateXRec
    Set XRec = Dic.item("Запись1")
    On Error GoTo 0
    
        'digType = 1070: strType = 1000
        ReDim xtypeOut(0 To 10) As Integer
        ReDim xdataOut(0 To 10) As Variant
        xtypeOut(0) = 1001: xdataOut(0) = "RDM"
        xtypeOut(1) = 1070: xdataOut(1) = 1001
        xtypeOut(2) = 1070: xdataOut(2) = 32222
        xtypeOut(3) = 1070: xdataOut(3) = 1002
        xtypeOut(4) = 1000: xdataOut(4) = "значение1002"
        xtypeOut(5) = 1070: xdataOut(5) = 1003
        xtypeOut(6) = 1000: xdataOut(6) = "значение1003"
        xtypeOut(7) = 1070: xdataOut(7) = 1004
        xtypeOut(8) = 1000: xdataOut(8) = "значение1004"
        xtypeOut(9) = 1070: xdataOut(9) = 1005
        xtypeOut(10) = 1000: xdataOut(10) = "значение1005"
    
    For cnt = 1 To 10000
        XRec.SetXData xtypeOut, xdataOut  'в этой строке утечка !!!!!!!!!!!!!!!!!!!
    Next cnt
    
Exit Sub

CreateDic:
    Set Dic = ThisDrawing.Dictionaries.Add("СловарьЗаписей")
    Resume
    
CreateXRec:
    Set XRec = Dic.AddXRecord("Запись1")
    Resume

End Sub
Просмотров: 4585
 
Непрочитано 14.08.2009, 01:05
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Я бы сначала очищал РД, и только потом записывал новые...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.08.2009, 01:10
#3
parkovaya1


 
Регистрация: 14.08.2009
Сообщений: 10


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я бы сначала очищал РД, и только потом записывал новые...
извините за серость... что такое РД?
parkovaya1 вне форума  
 
Непрочитано 14.08.2009, 01:31
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Расширенные данные.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.08.2009, 01:47
#5
parkovaya1


 
Регистрация: 14.08.2009
Сообщений: 10


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Расширенные данные.
для расширенных данных существует только два метода SetXData и GetXData (других в хелпе не нашел).

кроме того, если вывести записанные данные в приведенной выше процедуре методом GetXData, то будет четко видно, что РД не дублируются и рост памяти происходит по другой причине. то же самое вобщем то наблюдал и в Акад 2009 (2010 не ставил).

судя по всему это оно так работает, но как бы подчистить память не закрывая приложение??
parkovaya1 вне форума  
 
Непрочитано 14.08.2009, 09:30
#6
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


3,5 мб для 10000 тыс. записей РД - это много?.... мне кажется это не Автокад "жрёт", а кое-кто нерационально использует ресурсы программы!
Надеюсь текстовые объекты не создаются для хранения временной информации?
Евгений А. вне форума  
 
Непрочитано 14.08.2009, 10:59
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Я с РД уже бог знает сколько не работал... Напомни, сколько там ограничение объема? 16 кило?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.08.2009, 11:05
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Странная (IMHO) смесь использования Xrecord и Xdata...
Хотя утечки памяти в AutoCAD могут быть - их не может не быть...
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 14.08.2009, 14:57
#9
parkovaya1


 
Регистрация: 14.08.2009
Сообщений: 10


Цитата:
Сообщение от Евгений А. Посмотреть сообщение
3,5 мб для 10000 тыс. записей РД - это много?.... мне кажется это не Автокад "жрёт", а кое-кто нерационально использует ресурсы программы!
Надеюсь текстовые объекты не создаются для хранения временной информации?
да это много, т.к. в реальной программе идет просчет данных статистики, то записей РД происходит гораздо больше чем 10000 и завершение работы программы представляет собой сообщение о том что автокад съел всю системную память

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

собственно расширенные данные для меня тем и удобны, что позволяют сохранять результаты расчетов непосредственно в документе DWG

Цитата:
Странная (IMHO) смесь использования Xrecord и Xdata...
Хотя утечки памяти в AutoCAD могут быть - их не может не быть...
очень даже удобная, допустим у Вас есть объект - зубчатое колесо, представленный в автокаде в виде скажем блока (условного обозначения) и Вам нужно записать в него такие параметры как число зубьев, модуль и другие. при использовании методов ХДата это сделать проще всего. в результате получаем объект со свойствами, которые легко считать и перезаписать, при этом все сохраняется непосредственно в файле DWG
то же самое касается Xrecord - только его удобно применить для какого-нибудь абстрактного объекта, например, размерная цепь, где размерная цепь - словарь, составляющие звенья - записи этого словаря и каждой записи можно назначить свойства звеньев (длину, квалитет и т.п.)

Цитата:
Я с РД уже бог знает сколько не работал... Напомни, сколько там ограничение объема? 16 кило?
мне трудно точно сказать, т.к. занимаюсь по большей части прикладным программированием (потому и пользуюсь VBA),
но согласно формату dfx для кодов 1060-1070: 16-bit integer value, для 1000: String (with the introduction of extended symbol names in AutoCAD 2000, the 255-character limit has been increased to 2049 single-byte characters not including the newline at the end of the line)

Последний раз редактировалось parkovaya1, 14.08.2009 в 15:16.
parkovaya1 вне форума  
 
Непрочитано 14.08.2009, 15:15
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от parkovaya1 Посмотреть сообщение
то же самое касается Xrecord - только его удобно применить для какого-нибудь абстрактного объектанапример, размерная цепь, где размерная цепь - словарь, составляющие звенья - записи этого словаря и каждой записи можно назначить свойства звеньев (длину, квалитет и т.п.)
Но все это можно записать и в основные (0...999) группы для Xrecord. Впрочем это не мое дело - как хочешь так и делай. Судя по всему утечка памяти происходит в реализации ActiveX метода SetXdata. Попробуй поставить SP1/SP2 на AutoCAD 2007 или попробуй с более новыми версиями AutoCAD - возможно этот баг уже исправлен.
P.S.: Вообще-то на VBA я не пишу, но попробуй в конце кода поставить:
Код:
[Выделить все]
Erase xtypeOut
Erase xdataOut

Последний раз редактировалось Александр Ривилис, 14.08.2009 в 15:21.
Александр Ривилис вне форума  
 
Непрочитано 14.08.2009, 15:29
#11
Gogi


 
Регистрация: 15.11.2007
Сообщений: 15


Расширеные данные нужно обнулять перед записЬю, иначе они добавляются к уже имеюшимся. Обнуляются так:
Код:
[Выделить все]
       ReDim xtypeOut(0) As Integer
        ReDim xdataOut(0) As Variant
        xtypeOut(0) = 1001: xdataOut(0) = "RDM"
        XRec.SetXData xtypeOut, xdataOut
Gogi вне форума  
 
Автор темы   Непрочитано 14.08.2009, 15:49
#12
parkovaya1


 
Регистрация: 14.08.2009
Сообщений: 10


Цитата:
Сообщение от Gogi Посмотреть сообщение
Расширеные данные нужно обнулять перед записЬю, иначе они добавляются к уже имеюшимся. Обнуляются так:
Код:
[Выделить все]
       ReDim xtypeOut(0) As Integer
        ReDim xdataOut(0) As Variant
        xtypeOut(0) = 1001: xdataOut(0) = "RDM"
        XRec.SetXData xtypeOut, xdataOut
Я конечно попробовал обнулить данные в цикле (перед их записью) таким образом. Но это ровным счетом ничего не меняет, рост занимаемой памяти такой же. Да и по сути чем это обнуление отличается от записи?

Самое для меня странное - это то что в приведенном мной примере процедуры происходит многократная запись одного и того же массива XData в одну и ту же XRecord, данные не дублируются (проверено методом GetXData и проверено что обнуление записью массива с одним значением тоже не работает). Так на что в таком случае расходуется оперативная память??

Цитата:
Александр Ривилис
Судя по всему утечка памяти происходит в реализации ActiveX метода SetXdata. Попробуй поставить SP1/SP2 на AutoCAD 2007 или попробуй с более новыми версиями AutoCAD - возможно этот баг уже исправлен.
вот этого я и боялся, но все же возможно есть способ очистки памяти?

с новыми версиями так же есть осложнения, у меня установлена х64 система, а для х64 редакций Акад начиная с 2008 непрямая поддержка VBA (точно не помню как это формулируется, оговаривается что микрософт не планируют х64 версию VB), суть которой в том что необходимо адаптировать программных код (а его уже очень много) чтобы программа, которая работает х32 версии заработала на х64 и вобще на старших версиях программы советуют переходить на VB.NET, т.е. выбросить то что сделано на помойку и написать заново (

хотя я пробовал с х32 версией Акада 2009 (когда была такая возможность), все равно утечка есть, 2010 правда не ставил...

Последний раз редактировалось parkovaya1, 14.08.2009 в 16:03.
parkovaya1 вне форума  
 
Автор темы   Непрочитано 19.08.2009, 18:10
#13
parkovaya1


 
Регистрация: 14.08.2009
Сообщений: 10


Как оказалось в х64 редакции Акад 2010 существует (хоть и кривая) поддержка VBA. Ожидал большего .... однако, метод SetXdata по-прежнему кушает память, причем, несколько больше чем в Акад 2007. К тому же время выполнения приведенной выше программы в Акад увеличивается в разы. Вобщем впечатления от 2010 када в этом плане отрицательные.
Придется переходить на англоязычный форум, возможно так кто-нибудь подскажет путь решения проблемы...
parkovaya1 вне форума  
 
Непрочитано 20.08.2009, 10:06
#14
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Не помогут тебе и там! Тебе надо менять подход к своей программе.
Ещё раз повторю - использовать ресурсы программы надо рационально. Если твоя программа переписывает много раз одни и те жи РД, то надо использовать для этого простые переменные а в РД зписывать конечный результат. Так будет и в разы быстрее и с памятью проблем таких не будет.
Посмотри внимательно на РД - это некий список, относящийся к какому-то объекту и имеющий некое имя, по которому ты и можешь обратиться к этому списку. Когда ты создаешь РД, то добавляется новый список в общую базу данных Автокада, а к объекту добавляется лишь ссылка на эту запись, причём происходит проверка в уже имеющихся ссылках на РД с таким же именем, если уже есть такое, то старая ссылка удаляется из объекта (хотя скорее всего просто помечается как "удаленная"). Но сама запись из общей базы данных не удаляется, поэтому и происходит "утечка памяти" - это естественно для Автокада, так как скорость для него важнее.
Евгений А. вне форума  
 
Автор темы   Непрочитано 20.08.2009, 20:38
#15
parkovaya1


 
Регистрация: 14.08.2009
Сообщений: 10


Цитата:
Сообщение от Евгений А. Посмотреть сообщение
Не помогут тебе и там! Тебе надо менять подход к своей программе.
Ещё раз повторю - использовать ресурсы программы надо рационально. Если твоя программа переписывает много раз одни и те жи РД, то надо использовать для этого простые переменные а в РД зписывать конечный результат. Так будет и в разы быстрее и с памятью проблем таких не будет.
Посмотри внимательно на РД - это некий список, относящийся к какому-то объекту и имеющий некое имя, по которому ты и можешь обратиться к этому списку. Когда ты создаешь РД, то добавляется новый список в общую базу данных Автокада, а к объекту добавляется лишь ссылка на эту запись, причём происходит проверка в уже имеющихся ссылках на РД с таким же именем, если уже есть такое, то старая ссылка удаляется из объекта (хотя скорее всего просто помечается как "удаленная"). Но сама запись из общей базы данных не удаляется, поэтому и происходит "утечка памяти" - это естественно для Автокада, так как скорость для него важнее.
Спасибо, доходчиво объяснил, как я люблю ) Теперь когда все понятно, единственно возможное решение, которое было у меня в запасе придется воплощать в жизнь:
сделать все через ж**у, запуская акад из автономного приложения VB и выполняя ту же программу, с периодическим закрытием приложения када, повторным запуском и восстановлением процесса выполнения.

касательно ресурсов конечно да, но если бы все было так просто как кажется. в том что я наваял сам алгоритм построен с применением метода SetXdata как одного их ключевых блоков, т.к. через него идет обмен свойствами между объектами, которые так же идентифицируются (на основе дерева объектной модели для той методики, которую я использую) тем же методом, вобщем все очень плотно завинчено, но суть такая, что при кажущейся сложности реализации, программирование методики выполняется практически на лету, т.к. работаешь с объектами и их свойствами, не выдумывая каждый раз алгоритмы для согласования тех же промежуточных данных и т.п. и как ты написал скорость важна не только для Автокада... вот
еще раз спасибо всем, за то что пролили свет на мне доселе непонятное
вопрос можно считать исчерпанным
parkovaya1 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Асаd 2007 жрет память в методе SetXData. Как решить?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Юмор 2007 Огурец Разное 1172 29.12.2007 11:16
а как в 2007 АВТОКАДЕ ? 005 AutoCAD 1 21.06.2007 20:36
Как \"отобрать\" у Windows оперативную память? ander Прочее. Программное обеспечение 32 23.03.2007 05:24
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46