Как DumpSave функцию? - PullRequest
       1

Как DumpSave функцию?

2 голосов
/ 26 октября 2011

Я пытаюсь определить функцию в модуле, а затем сохранить определения функций в файл, используя DumpSave.Однако перезагрузить функцию не удается.Вот минимальный пример

buildf[]:= Module[{res},
    res[x_]:=x^2;
    res
];
f=buildf[];
DumpSave["f.mx", f];
Clear[f];
Get["f.mx"]

Теперь я ожидал бы, что f будет квадратной функцией, однако она останется неопределенной после оператора Clear.Как я могу решить эту проблему?

Вопрос тесно связан с моим предыдущим вопросом несколько месяцев назад, но его решение здесь мне не поможет.

Любой намекприветствуется!

Обновление buildf читает несколько файлов данных, преобразует их, определяет правила на их основе и вызывает Dispatch для быстрого поиска.Функция, возвращаемая buildf, тогда является чем-то вроде API для данных.Я хочу избежать вызовов на buildf и скорее загрузить двоичный дамп созданной функции данных.

Метод Save кажется многообещающим, но он все еще не работает.Я постараюсь выделить проблему, чтобы воспроизвести ее здесь.

Окончательное обновление После комментария @Leonid о том, что уникальность локальных переменных не гарантируется для всех сессий, я решил использовать это«Механизм кэширования DumpSave» только для простых структур данных, но не для функций, зависящих от других символов.

Ответы [ 3 ]

3 голосов
/ 26 октября 2011

Вы можете увидеть что-то происходящее, если вы используете Save вместо DumpSave.

Я получаю файл, который выглядит так:

f = res$636

Attributes[res$636] = {Temporary}

res$636[x_] := x^2

Это (Save вместо DumpSave) на самом деле работает, но я полагаю, что атрибут Temporary приводит к тому, что он теряется или не сохраняется в первую очередь при использовании DumpSave.


Я должен отклонить свое утверждение выше, поскольку я могу вручную очистить атрибут Temporary от символа res$*, но он все равно не может быть сохранен и загружен.

3 голосов
/ 26 октября 2011

Вы возвращаете локальную переменную (res) из Module. Конечно, это не работает, и в результате вы получаете «локализованную» (переименованную) версию res.

Попробуйте

f = buildf[]
?f

и вы получите что-то вроде f=res$538. Эта локальная переменная имеет атрибут Temporary и может быть удалена (и, следовательно, f может перестать работать) в любую минуту.

Если вы DumpSave символ f, его определение как f=res$538 будет сохранено и его можно будет перезагрузить (как вы можете проверить с помощью ?f). Но это не очень полезно.

Вопрос здесь: Почему вы вообще используете эту buildf функцию? Чего вы пытаетесь достичь?

РЕДАКТИРОВАТЬ: Как Леонид указал ниже, то, что я написал выше, не совсем правильно: символы с DownValue s, возвращенные из Module, похоже, не удаляются, даже если они не упоминается. Можно все еще задаться вопросом, соответствует ли это поведение между версиями и будет ли оно таким же в будущем.

2 голосов
/ 26 октября 2011

Это, очевидно, гораздо более простой, чем я думал вначале. Я редко использую DumpSave из-за созданного системно-зависимого двоичного формата, и я думал, что он ведет себя так же, как Save. Однако, похоже, это не так.

Рассмотрим:

test[x_] := x^2
f = test;
DumpSave["test.mx", f]
Quit[]

Далее:

Get["test.mx"]
Information[f]
Information[test]

В моей системе нет определения и / или загрузки для test.

Контрастность с:

test2[x_] := x^2
f2 = test2;
Save["test2.m", f2]
Quit[]

Далее:

Get["test2.m"]
Information[f2]
Information[test2]

Где определение для test2 правильно сохранено и загружено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...