Как я могу сказать, сколько памяти дескриптор возражает использованию в matlab

Если я объявляю, что объект быть подклассом дескриптора classdef obj <обрабатывает мой объект, теперь по существу "указатель" на некоторую память где-нибудь. Как я узнаю, сколько памяти мой объект израсходовал?

Например, скажите, что у меня есть нечто класса с полевой панелью

classdef foo < handle 
properties
    bar = randn(1000);
end

панель поднимает 8 мегабайтов (8 байтов * 1 миллион чисел)

но если я ввожу

obj = foo();
whos('obj');

Я добираюсь

Name      Size            Bytes  Class    Attributes

  obj      1x1                60  foo                

Как я узнаю, на какое количество указывает общая память obj?

15
задан chappjc 20 October 2013 в 00:37
поделиться

1 ответ

В качестве хака преобразуйте ее в структуру и посмотрите, сколько места она займет. Я думаю, что все данные будут выставлены в "обычных" полях объекта.

f = foo();
origWarn = warning();
warning off 'MATLAB:structOnObject'
s = builtin('struct', f); % use 'builtin' in case @foo overrides struct()
warning(origWarn);

Тогда вы можете увидеть это в whos.

>> whos
  Name      Size              Bytes  Class     Attributes

  f         1x1                  60  foo                 
  s         1x1             8000124  struct       

Это всего лишь первое приближение. Он скажет вам, сколько памяти используют его поля. Если какой-либо из них содержит объекты-дескрипторы, вам необходимо выполнить рекурсию вниз по полям этой структуры и преобразовать любые другие объекты-дескрипторы в структуру для подсчета их полей. (Если вы хотите включить память объектов Java, вам также понадобится отдельная функция для оценки размера их хранилища. Вероятно, не стоит беспокоиться.) Теперь, когда в Matlab есть замыкания, дескрипторы функций также могут содержать данные; вам нужно будет подключиться к тем, кто использует functions (), если вы хотите подсчитать закрытые данные.

Если вы работаете с объектами-дескрипторами, у вас могут быть псевдонимы и даже циклические ссылки на уровне M-кода, поэтому вам нужно следить за этим при рекурсии. (Извините, я не знаю, как справиться с этим в новой системе объектно-ориентированного программирования.)

Отображение памяти в whos также будет дважды подсчитывать массивы, которые совместно используют память с помощью оптимизации копирования при записи в Matlab. Вот конкретный пример.

x = NaN(1,10000);
s.x = x;
s.y = x;
s.z = x;


>> whos
  Name      Size                Bytes  Class     Attributes

  s         1x1                240372  struct              
  x         1x10000             80000  double              

На самом деле s потребляет всего около 80 КБ; он просто содержит три указателя на x. И эти 80 КБ - это те же 80 КБ, которые потребляет сам x. Если вы не измените какой-либо из них; затем выделяется новый массив. Whos () не позволит вам различать эти случаи. Справиться с этим сложно; AFAIK единственный способ сделать это - использовать файл MEX для получения указателя (ей) данных mxarray и самостоятельно пройти по дереву объектов, обнаруживая указатели с псевдонимом и подсчитывая байты с псевдонимом.

Это общая проблема с измерением размера объектов в памяти, когда их компоненты могут использоваться совместно. Это не отдельные физические объекты. По крайней мере, вы не в C, работая с указателями на произвольные блоки памяти.

11
ответ дан 1 December 2019 в 04:40
поделиться