AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.11.2005, 14:05   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
тоже присоединяюсь к вопросу - зачем?

если посмотреть хочется, то смотрите недокументированный класс HeapCheck
Пример использования в Heaplog.getInfo()
__________________
полезное на axForum, github, vk, coub.
Старый 29.11.2005, 14:13   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от mazzy
если посмотреть хочется, то смотрите недокументированный класс HeapCheck Пример использования в Heaplog.getInfo()
HeapCheck имеет много методов. Но ни одного, чтобы посмотреть размер памяти под объект, а не под "блок". Можно, правда, создать миллион объектов и надеяться, что они займут 99% памяти, которую можно посмотреть в форме SysHeapCheck.
Старый 29.11.2005, 14:15   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от EVGL
Похоже, не существует. Посмотрите, как задается размер Binary в классе WinAPI. Если же нужно узнать размер сложной структуры, я бы запаковал бы ее в контейнер и посмотрел бы размер контейнера.
Размер контейнера и размер выделенной памяти - не одно и тоже.
В общем случае

Цитата:
Сообщение от EVGL
HeapCheck имеет много методов. Но ни одного, чтобы посмотреть размер памяти под объект, а не под "блок".

Совершенно верно. Поскольку память в Аксапте (да и в Java-машине) выделяется не под каждый объект.
Пусть человек разбирается, если хочется.
Может таки разберется и другим рассказывать будет.
__________________
полезное на axForum, github, vk, coub.
Старый 29.11.2005, 16:25   #4  
SolNik is offline
SolNik
Участник
 
58 / 36 (2) +++
Регистрация: 22.10.2003
Всем спасибо, но времени разбираться с недокументированными классами не было, а типы структур данных уже известны - решил сам набросать метод посчитывающий занимаемую память. Считает для::Container, Date, Integer, Real, String, Array, Struct, Map. Для остальных типов возвратит 0.
PHP код:
static int getMemSizeOfItem(anyType _item)
{
    
int         i;
    
int         result;
    Array       
arr;
    
Struct      struct;
    
Map         map;
    
MapIterator mi;
    ;

    switch (
typeOf(_item))
    {
        case 
types::Container :
            
result 0;
            for (
i=1i<=conLen(_item); i++)
            {
                
result+=RTRTimeAccountProcess::getMemSizeOfItem(conPeek(_itemi));
            }
        break;

        case 
types::Date result 4;
        break;

        case 
types::Integer result 4;
        break;

        case 
types::Real result 8;
        break;

        case 
types::String result strLen(_item);
        break;

        case 
types::Class :
            switch (
classIdGet(_item))
            {
                case 
classNum(Array) :
                    
arr _item;
                    for (
i=1i<=arr.lastIndex(); i++)
                    {
                        
result+=RTRTimeAccountProcess::getMemSizeOfItem(arr.value(i));
                    }
                break;

                case 
classNum(Struct) :
                    
struct _item;
                    for (
i=1i<=struct.fields(); i++)
                    {
                        
result+=RTRTimeAccountProcess::getMemSizeOfItem(struct.valueIndex(i));
                    }
                break;

                case 
classNum(Map) :
                    
map _item;
                    
mi  = new MapIterator(map);
                    while (
mi.more())
                    {
                        
result+=RTRTimeAccountProcess::getMemSizeOfItem(mi.key());
                        
result+=RTRTimeAccountProcess::getMemSizeOfItem(mi.value());
                        
mi.next();
                    }
                break;
            }
        break;
    }

    return 
result;


Старый 29.11.2005, 16:38   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от SolNik
Всем спасибо, но времени разбираться с недокументированными классами не было, а типы структур данных уже известны - решил сам набросать...
Жаль... Вот так оно всегда в Аксапте...
А все из-за документации...

Немного критики и предложений:
1. вы ответили не на исходный вопрос "размер памяти, занимаемой объектом", а на другой - "Сколько памяти могут занимать объекты при ваших предположениях". Кроме того, сами предположения требуют пересмотра. Например, непонятно как реально хранится строка - как sz или bsz.
2. Вообще говоря, стоит проверять не только id самого класса, но и id его родителей. Вдруг кто-нибудь от map создаст потомка? Т.е. вместо classIdGet() метод SysDictClass::isSuperClass(...)

Разобрались бы с HeapLog.
Хоть EVGL и прав - вы не увидите там размер каждого объекта.
Но зато очень точно и быстро увидите общий размер памяти, выделенной под различные кучи ...
А это как раз то, что вам нужно, насколько я понимаю...
__________________
полезное на axForum, github, vk, coub.
Старый 29.11.2005, 17:08   #6  
SolNik is offline
SolNik
Участник
 
58 / 36 (2) +++
Регистрация: 22.10.2003
Цитата:
1. вы ответили не на исходный вопрос "размер памяти, занимаемой объектом", а на другой - "Сколько памяти могут занимать объекты при ваших предположениях".
За отсутсвием информации об универсальном решении такой задачи пришлось самому решать свою локальную . Это ни в коем случае не универсальное решение
- а как вариант решения такой задачи, который для моего случая вполне подходит. Уверен что есть более красивые решения.
По поводу строк - у меня все динамические...не знаю как Аксапта выделяет память для строк фиксированной длины - если резервирует - то функция отработает неверно - но для динамических, я думаю, соответствует кол-ву символов в строке.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Размер буфера MironovI DAX: Администрирование 5 20.03.2009 11:52
Использование памяти клиентского ПК falcon65 DAX: Администрирование 0 07.11.2007 11:49
Как сохранять размер связанных форм? BlueRose DAX: Программирование 2 15.06.2006 17:06
Неудобство использования аналитик "Цвет" и "Размер" clerk DAX: Функционал 17 23.05.2005 13:08
В памяти остается COM (Excell) bucken DAX: Программирование 3 19.12.2003 18:08
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:21.