MATLAB слабые ссылки для обработки объектов класса - PullRequest
8 голосов
/ 16 декабря 2010

Размышляя о возможности ORM на основе класса дескриптора в MATLAB, возникла проблема с кэшированием экземпляров. Я не мог сразу придумать способ сделать слабые ссылки или слабую карту, хотя я предполагаю, что что-то можно придумать со слушателями событий. Есть идеи?

Подробнее

В MATLAB класс дескриптора (в отличие от класса значений) имеет ссылочную семантику. Примером, включенным в MATLAB, является класс containers.Map. Если вы создадите экземпляр и передадите его функции, любые изменения, внесенные функцией в объект, будут видны через исходную ссылку. То есть он работает как ссылка на объект Java или Python.

Подобно Java и Python, MATLAB так или иначе отслеживает, сколько вещей ссылаются на каждый объект класса дескриптора. Когда их больше нет, MATLAB знает, что удалить объект безопасно.

Слабая ссылка - это ссылка, которая ссылается на объект, но не считается ссылкой для целей сборки мусора. Таким образом, если единственные оставшиеся ссылки на объект являются слабыми, то его можно выбросить. Как правило, событие или обратный вызов могут быть переданы для слабой ссылки - когда объект отбрасывается, слабые ссылки на него уведомляются, что позволяет запускать код очистки.

Например, карта слабых значений похожа на карту нормалей, за исключением того, что значения (в отличие от ключей) реализованы как слабые ссылки. Класс слабой карты может организовать обратный вызов или событие для каждой из этих слабых ссылок, чтобы при удалении ссылочного объекта запись ключа / значения на карте удалялась, сохраняя карту красивой и аккуратной.

Ответы [ 2 ]

3 голосов
/ 17 декабря 2010

Эти специальные ссылочные типы действительно являются функцией уровня языка, а для этого вам нужны виртуальные машины и GC.Попытка реализовать его в пользовательском коде, скорее всего, закончится слезами, особенно если вы полагаетесь на недокументированное поведение.(Извините, что остаюсь в грязи.)

Есть несколько способов сделать что-то подобное.Это просто идеи, а не одобрения;На самом деле я их не делал.

Возможно, вместо кэширования экземпляров объектов Matlab как таковых, вы могли бы кэшировать дорогостоящие результаты вычислений, используя реальную карту слабых ссылок Java в JVM, встроенную в Matlab.Если вы сможете относительно быстро конвертировать значения Matlab в Java и из Java, это может быть победой.Если это относительно плоские числовые данные, примитивы типа double [] или double [] [] быстро преобразуются с помощью неявного преобразования Matlab.

Или вы можете создать обычный кэш объекта LRU на уровне Matlab (возможно, используя контейнеры.Карта, отмеченная хеш-кодами), которая явно удаляет объекты внутри нее при добавлении новых.Либо используйте его напрямую, либо добавьте поведение onCleanup () к вашим объектам, в котором они автоматически добавляют свою копию в глобальный кэш LRU «недавно удаленные объекты» фиксированного размера, снабженный внешне значимым идентификатором, и отмечают экземпляры вкеш, поэтому ваш метод onCleanup () не пытается повторно добавить их, когда они удалены из-за истечения срока действия из кеша.Тогда вы могли бы иметь фабричный метод или другой метод поиска, «воскрешающий» экземпляры из кэша, вместо того, чтобы создавать совершенно новые дорогой способ.Это звучит как большая работа, и на самом деле это не идиоматический Matlab.

3 голосов
/ 17 декабря 2010

Это не ответ на ваш вопрос, а только мои 2 цента.

Слабая ссылка - это особенность сборщика мусора.В Java и .NET сборщик мусора вызывается, когда нагрузка на память высока и поэтому является недетерминированной.

В этом посте MATLAB Digest говорится, что MATLAB не использует (недетерминированный) сборщик мусора,В MATLAB ссылки удаляются из памяти (детерминистически) в каждом стеке, т. Е. При выходе из каждой функции.

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

В этом SO-сообщении Я спросил о реализации MATLAB сборщика мусора и не получил реального ответа.Один из сотрудников MathWorks вместо ответа на мой вопрос обвинил меня в попытке построить аргумент Python против MATLAB.Другой сотрудник MathWorks написал что-то, что выглядело разумным, но по сути - умным обманом - целенаправленным отвлечением от проблемы, о которой я спрашивал.И лучший ответ был:

, если вы зададите этот вопрос, то MATLAB - не тот язык, который вам подходит!

...