Как в mathematica очистить память

Обновлено: 07.07.2024

Я внес в название темы слова "Wolfram Mathematica" для того, чтобы заведомо сузить круг вопросов.

Дело вот в чем: я использую это математическое ПО, но некоторые операции занимают слишком много времени, поэтому я решил каким-либо образом повысить производительность компьютера, настроив его должным образом и не совершенствуя пока hardware-часть.

У меня ноутбук Sony Vaio c 6 Гб оперативной памяти, процессор Intel Core i7-2630QM CPU @ 2.00 Hgz 2.00 GHz, на нем - 64-разрядная Windows 7. Процесс, соответствующий Wolfram Mathematica, выполняется у меня на всех ядрах, которых у процессора 7.

Каким образом можно было бы улучшить производительность компьютера для ускорения работы Mathematica, какое ПО вы бы посоветовали для оптимизации и настройки операционной системы? Имеет ли смысл отключить большую часть выполняемых параллельно процессов, а оставшиеся - перебросить на одно ядро ("процессор", как пишет ОС)?

Конфигурация компьютера
Процессор: i7-3960x @ 3.3 GHz
Материнская плата: Asus P9X79 Pro
Память: 8 x Kingston KHX1600C9D3/8G
HDD: 4х Hitachi HDS724040ALE640, Seagate ST3000DM001-9YN166, 4x WDC WD20EARS-00MVWB0, Intel SSDSC2BW120A4
Видеокарта: Asus Geforce GTX Titan + MSI GTX580 (не используется)
Звук: интегрированная
Блок питания: Silverstone ST1500, 1500W, февраль 2012
CD/DVD: 2 x Lite-on iHAS-122
Монитор: NEC EA193Mi 19"
Ноутбук/нетбук: Gigabyte P34G (debian)
ОС: Debian Jessie
Индекс производительности Windows: 0. За отсутствием Windows
Прочее: SATA-контроллер Promise FastTrak TX4650
Имеет ли смысл отключить большую часть выполняемых параллельно процессов, а оставшиеся - перебросить на одно ядро »
Нет, не имело бы. Единственный способ увеличить скорость исполнения это писать более эффективные наборы команд. Например, научиться, если Вы еще не умеете, правильно использовать функцию Parallelize и почаще её использовать. Поскольку самые вроде бы легко распараллеливаемые вычисления, вроде вычислений факториала натурального числа или сумм исполняются в один поток.
Кроме того, по возможности чаще использовать при последующих вычислениях результаты предыдущих. Вероятно Вы обращали внимание, что повторное вычисление всегда происходит очень быстро - Mathematica не повторяет расчеты, а сразу берет готовый результат, несмотря на то, что Вы его в явном виде не сохранили ни в какой переменной.
К тому же, Вам грех жаловаться. В начале 90-х простейшие квантовомеханические расчеты на Intel 80386 занимали полный рабочий день.

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.

В MATLAB существует функция, позволяющая удалить все текущие переменные. Это очень полезно, если вы начинаете что-то совершенно новое и не хотите создавать конфликты с более ранними вычислениями. Сейчас я ищу что-то похожее для Mathematica, но ничего не нашел, кроме Clear [VAR], который удаляет только переменную VAR.

ОТВЕТЫ

Ответ 1

Я рекомендую один из двух способов:

1. Ярлык клавиатуры для выхода из [] ядра

Существует системный файл KeyEventTranslations.tr , который вы можете редактировать для настройки сочетаний клавиш. Я, как и другие, добавил Ctrl + Q в Quit[] ядро, что позволяет быстро очистить все переменные сеанса. Для получения дополнительной информации об установке этого параметра см.:

2. Дайте новому ноутбуку уникальный контекст

В Mathematica текущий $Context определяет, к какому Context относятся неквалифицированные имена символов. Предоставляя новому Notebook уникальный Контекст, который легко делается через меню Evaluation , символы, используемые в этом Ноутбуке, не будут сталкиваться с неквалифицированными символами в других Ноутбуках. Для получения более подробной информации см. Следующий вопрос:

Ответ 2

Вы можете использовать ClearAll , чтобы очистить переменные и их атрибуты в контексте Global (по умолчанию) следующим образом:

Если вы работаете в другом контексте (например, конкретном конкретном контенте или конкретном контексте группы), вы можете сделать

Если вы хотите удалить все символы из ядра, чтобы Mathematica больше их не распознавала, вы можете использовать Remove[] аналогично двум приведенным выше примерам.

Если это запрещено, вы всегда можете выйти из ядра с помощью Quit[] , который удалит все символы. В следующий раз, когда вы что-то оцениваете, будет запущено новое ядро.

Ответ 3

Я просто понял, что вы, возможно, не знаете, что в отличие от MATLAB, Mathematica предназначен для работы как два отдельных процесса: Front End - это пользовательский интерфейс и позволяет работать с ноутбуками. Ядро выполняет вычисления. Вы можете выйти из ядра, не затрагивая интерфейс, или даже запустить более одного ядра для разных ноутбуков, или запустить ядро ​​на удаленном компьютере и использовать его с локальным интерфейсом.

Я считаю, что единственным надежным способом очистки всего является Quit ядро ​​и перезапустить его (что автоматически). Есть слишком много вещей, которые могут быть изменены отдельно от пользовательских переменных/функций (включая In / Out , загруженные пакеты, системные кеши и т.д.). Поэтому, если вам нужен действительно свежий старт, я рекомендую Quit .

Для "мягкого" reset, уже упомянутого @yoda ClearAll["Global`*"] . Там пакет << Utilities`CleanSlate` , который автоматизирует немного больше, чем это. Вы можете прочитать документы пакета внутри файла AddOns\ExtraPackages\Utilities\CleanSlate.m .

Короче говоря, CleanSlate[] попытается вернуть вас в состояние ядра при загрузке пакета. ClearInOut[] очистит In и Out , чтобы сохранить память.

Я не использовал этот пакет за многие годы (за исключением функциональности ClearInOut[] ), так как ядро ​​Mathematica запускается быстро на современных компьютерах, поэтому я просто использую Quit . Поэтому я не могу сказать, насколько хорошо это работает.

в MATLAB есть функция ясный удалить все текущие переменные. Это очень полезно, если вы начинаете что-то совершенно новое и не хочу конфликтов с более ранними расчетами. Я ищу что-то подобное для Mathematica сейчас, но я не мог найти ничего, кроме очистить[VAR] который удаляет только переменную VAR.

Я рекомендую один из двух методов:

1. Сочетание клавиш для выхода из [] ядра

существует системный файл KeyEventTranslations.tr Что вы можете редактировать, чтобы настроить сочетания клавиш. Я, как и другие, добавил Ctrl + Q to Quit[] ядро, позволяющее быстро очистить все переменные сеансов. Дополнительные сведения о настройке см. В разделе:

2. Дайте новый ноутбук уникальный контекст

в Mathematica, текущий $Context определяет контекст неквалифицированные имена символов принадлежат. Давая новый ноутбук уникальный контекст, который легко сделать через Evaluation меню, символы, используемые в этой записной книжке, не будут сталкиваться с неквалифицированными символами в других записных книжках. См. следующий вопрос для получения более подробной информации информация:

можно использовать ClearAll чтобы очистить переменные и их атрибуты в вашем Global контекст (по умолчанию), например:

если вы работаете в другом контексте (например, конкретный контекст для ноутбука или конкретный контекст для группы ячеек), вы можете сделать

если вы хотите удалить все символы из ядра, так что Mathematica больше не распознает их, вы можете использовать Remove[] аналогично приведенным выше двум примерам.

запрет данные, вы всегда можете выйти из ядра с Quit[] который удалит все символы. Новое ядро будет инициировано в следующий раз, когда вы что-то оцениваете.

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

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

для" мягкого " сброса @yoda уже упоминалось ClearAll["Global`*"] . Есть << Utilities`CleanSlate` пакета, который автоматизирует немного больше, чем это. Вы можете прочитать документы пакета внутри AddOns\ExtraPackages\Utilities\CleanSlate.m файл.

короче, CleanSlate[] попытается вернуть вас в состояние ядра, когда пакет был загружен. ClearInOut[] очистить In и Out сохранить память.

Я не использовал этот пакет в течение многих лет (за исключением ClearInOut[] функциональность), так как ядро Mathematica быстро запускается на современных компьютерах, поэтому я просто использую Quit . Поэтому я не могу сказать вам, как хорошо это работает.

Я плохой кешер: иногда, когда никто не смотрит, я кэширую результаты, не включая полный контекст, например:

Это приводит к ужасно незаметным ошибкам и, что более важно, к необходимости очистки кеша при изменении контекста. Один из способов очистки кеша - полностью Clear символ и повторить определения, но на самом деле это не решение.

Что мне действительно нужно, так это метод очистки всех DownValues ​​без шаблонов, связанных с символом.
Для ясности я включу свое нынешнее решение в качестве ответа, но если не удастся по двум причинам

  • Он очищает только DownValues ​​с полностью числовыми аргументами
  • По эстетическим причинам я бы не хотел использовать Block для получения DownValues.

Есть идеи, как улучшить ClearCache ?

4 ответа

Раньше я делал аналогичные функции (но не помню, где).

Делает ли следующий код все, что вам нужно?

Возможно, это следует расширить до UpValues и SubValues . И Head из f ограничен до Symbol .

Это мое нынешнее решение проблемы, но, как уже упоминалось в вопросе, это не совсем поиск без шаблонов DownValues и не очень элегантный.
Храните DownValues для f

Найдите DownValues , чтобы очистить его внутри Block , чтобы избежать немедленной оценки

Примените Unset к целевому DownValues внутри удерживаемого списка и затем отпустите

Это отлично работает

А завернуть можно так:

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

Код

Использование и описание

Эта версия работает с функциями, которые принимают единственный числовой аргумент. Вызовите memo[f][x] вместо f[x] , чтобы использовать мемоизированную версию. Кэшированные значения по-прежнему связаны с f , поэтому, когда f очищается, они исчезают. По умолчанию количество кэшируемых значений ограничено 200. Используйте memoClearCache[f] , чтобы удалить все мемоизированные значения.

Просто чтобы дополнить другое отличное решение: если у вас очень большой список DownValues и вы предъявляете строгие требования к эффективности для ClearCache , вы можете значительно ускорить процесс, очистив все определения и затем воссоздав только те, которые содержат узоры. Вот пример:

Обратите внимание, что вам нужно вызвать createDefs только один раз с кодом, который создает определения функции на основе шаблонов. В остальных случаях вы называете его createDefs[f] , потому что он запоминает код, необходимый для воссоздания определений при первом вызове.

Также возможно, что вы не хотите наращивать огромные кеши, но это выходит за рамки вашего контроля при простом подходе f[x_]:=f[x]=rhs . Другими словами, кеш может содержать много ненужного старого материала, но при таком подходе вы не можете отличить старые (больше не используемые) определения от новых. Я частично решил эту проблему с помощью пакета, который я назвал Cache, который можно найти здесь вместе с блокнот, иллюстрирующий его использование. Это дает вам больше контроля над размером кеша. У него есть свои проблемы, но иногда он может быть полезен.

Читайте также: