Временные переменные в Mathematica

Я написал пакет для Mathematica под названием MathOO. Короче говоря, это позволяет вам использовать объектную ориентацию в Mathematica точно так же, как в Python. Подробности см. в следующей статье на Voofie/MathOO:

MathOO: Добавление объектной ориентации в стиле Python в Mathematica с помощью MathOO (запуск бета-версии 1.0) [Альтернатива Objectica]

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

NewClass[Object1]
Object1.$init$[self_]:= Return[];

В приведенных выше двух строках я только что определил Object1 как новый класс, а конструктор — как пустую функцию. Если вы знакомы с Python, вы должны увидеть сходство с __init__().

Чтобы создать экземпляр Object1, я делаю:

object1 = new[Object1][]

Результат:

Out: object$13

Здесь object$13 — это временная переменная. Я хочу, чтобы при отсутствии ссылок на эту временную переменную она автоматически удалялась. Но это не работает, как ожидалось. Я определил проблему следующим образом:

In:  y = Module[{x}, x[1] = 2; x]
Out: x$117

In:  FullDefinition[y]
Out: y = x$117
     Attributes[x$117] = {Temporary}
     x$117[1] = 2

Так как y содержит ссылку x$117, то x$117 еще не удален. Теперь давайте удалим ссылку, установив значение y равным 1:

In:  y = 1;

Однако x$117 все еще здесь:

In:  Definition[x$117]
Out: Attributes[x$117] = {Temporary}
     x$117[1] = 2

Но я ожидал, что переменная будет удалена, так как на нее больше не ссылаются. В руководстве по Mathematica сказано:

Временные символы удаляются, если на них больше не ссылаются:

Итак, это ошибка Mathematica? Или есть какие-то методы обхода? Я использую Mathematica 7.0. Большое Вам спасибо.


person Ross    schedule 06.11.2010    source источник
comment
См. этот ответ для некоторых ошибок в сборщик мусора, связанный с Module.   -  person Alexey Popkov    schedule 16.08.2011


Ответы (2)


Mathematica действительно собирает мусор Temporary переменных, когда на них больше нет ссылок. Тем не менее, есть две причины, по которым ваши x$117 не собираются мусором.

  1. Помните, что Module использует лексическую область видимости, поэтому переменные модуля являются «локальными» только в том смысле, что им дается уникальное имя «var$modnum» и Temporary Attribute. Поскольку вы дали x значение DownValue, его необходимо очистить, прежде чем x можно будет собрать мусор.

  2. Ваш y был установлен как временная переменная x$..., а выход был назначен Out[]. Так что вам также нужно очистить историю: Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];.

Тогда ваш пример Module кажется правильно собранным мусором.


При использовании вашего пакета MathOO (который я скачал вчера, но еще не пробовал), возможно, вы можете просто установить $HistoryLength на некоторое конечное число. И порекомендовать пользователям подавлять вывод экземпляров object1 = new[Object1][];

person Simon    schedule 06.11.2010
comment
да. Для 2-го пункта я обычно подавляю вывод. я опустил ; только для того, чтобы программа вывела имя переменной, чтобы я мог увидеть ее определение позже. Теперь основная проблема заключается в том, что я не знаю, когда пользователь не будет ссылаться, и DownValue является обязательным. Является ли это DownValue еще одной ссылкой, выходящей за рамки x? Я просто не хотел очищать DownValue и надеюсь, что он все еще может быть собран мусором. - person Ross; 07.11.2010
comment
Я хотел бы использовать переменную в качестве словаря. Как дикт в Python. Когда нет ссылки на переменную, значение DownValue вообще не имеет значения, и поэтому его следует удалять сборщиком мусора. Я не понимаю, почему Mathematica не собирает его и думает, что я все еще хочу его использовать после этого. - person Ross; 07.11.2010
comment
Обратите внимание, что подавление вывода с помощью ; не предотвращает присвоение фактического возвращаемого значения Out[n]. - person Michael Pilat; 08.11.2010
comment
@Michael: Спасибо, что напомнили нам об этом - и мой ответ, и комментарий i-freaker сделали это неверное предположение. - person Simon; 08.11.2010
comment
@i-freaker: я точно понимаю, чего вы хотите (и могу догадаться, как это вписывается в MathOO, несмотря на то, что вы Encode занимаетесь пакетом :( ). Я не уверен, что это можно просто реализовать, но, возможно, на ваш вопрос о математической группе будет дан ответ. кто-то из WRI. Я не уверен, что WRI будет рассматривать поведение Module/Temporary как ошибку или функцию! Я могу придумать пару уродливых хаков, но ничего, что было бы быстрым и удобным... - person Simon; 08.11.2010
comment
Я тоже думаю о взломе. Но это немного усложнит простой код. Кроме того, я не могу выполнять сборку мусора через регулярные промежутки времени. Я не могу найти функцию таймера для выполнения функции в определенное время или при нехватке памяти. - person Ross; 08.11.2010
comment
@i-freaker: как насчет создания палитры (которую можно отключить), которая открывается при загрузке вашего пакета (например, sites.google.com/site/grassmannалгебра) имеет динамически обновляемый список классов и объектов. И еще один динамически обновляемый объект, отслеживающий использование памяти, в который встроен механизм контроля мусора с большим UpdateInterval? - person Simon; 09.11.2010
comment
Спасибо Семён за идею. Я думаю, что переполнение стека не подходит для обсуждения. Присоединяйтесь к обсуждению в этом посте. voofie.com/content/178/добавление-сборщика-мусора-в -мату. Большое спасибо за ваш вклад. - person Ross; 09.11.2010
comment
@Ross В Mma8 теперь есть функция reference.wolfram.com/mathematica/ref/CreateScheduledTask .html - person Simon; 15.11.2010

Mathematica — это система перезаписи строк (внизу) (вроде) (не совсем) (но на самом деле) (В ЛЮБОМ СЛУЧАЕ...) DownValue «x$117[1] = 2» — это правило перезаписи строк, которое не совсем неточно представить, что это запись в ассоциативном массиве. Массив называется «x $ 117», а запись представляет собой пару {1,2}. Пока в массиве есть запись, ссылка на символ "x$117" не будет выполняться Mma.

Лучше всего удалять символы Remove[], когда они уничтожаются или выходят за рамки. (Clear[] недостаточно, так как устаревшие атрибуты, сообщения или значения по умолчанию, связанные с символами, не удаляются Clear[] и поэтому Mma по-прежнему будет содержать живые ссылки на символ.)

person Eric Towers    schedule 10.11.2010