2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Mathematica - очистка памяти
Сообщение31.08.2014, 20:17 
Предусмотрена ли в Mathematica возможность полностью очистить всю память используемую программой? Т.е. очистить всё, что программа назанимала в результате последних вычислений.

Конкретно проблема такая: у меня код, в котором среди прочего идет экспорт/импорт данных в файлы (просто подозреваю, возможно, это создает проблему). Так вот в ходе решения задачи приходится компилировать весь код много раз, незначительно изменяя лишь какой-то один параметр в нем. Если выполнить код, изменить параметр, и запустить весь код снова – выдается куча ошибок. Если же после выполнения кода закрыть Mathematica, а затем открыть и запустить код с новыми параметрами, то ошибок никаких нет и код работает нормально.

Другой случай, когда, вероятно, требуется очистка памяти. Допустим есть большой код, состоящий из нескольких блоков. Каждый блок вполне самостоятелен, т.е может выполняться независимо от других. В ходе работы одного блока в нем создается большой объем промежуточной информации (от нескольких Гб.). Если я хочу запустить весь код сразу, так чтобы блоки выполнялись поочередно, без моего контроля, то на определенном этапе возникает проблема. Первые 1-2 блока выполняются нормально, затем насколько я помню (дело было давно) Mathematica сталкивается с нехваткой памяти и прекращает вычисления и освобождает всю память сама. Функции типа Clear[], ClearAll[], записанные в конце каждого блока применительно к переменным этого блока, не помогают.

 
 
 
 Re: Mathematica - очистка памяти
Сообщение31.08.2014, 22:52 
Переменная $HistoryLength хранит количество последних вычислений, которые математика помнит. Команда $HistoryLength = 0 говорит математике не запоминать результаты вычислений. В случае большого количества команд это часто спасает от переполнения памяти.

 
 
 
 Re: Mathematica - очистка памяти
Сообщение31.08.2014, 23:35 
Аватара пользователя
AFAIK, $HistoryLength регулирует своевременное стирание данных, связанных с именем Out.
По моему опыту Математика не очень-то охотно высвобождает память. Особенно неприятны утечки, связанные с отводом данных в Dynamic для интерактива.
Я заметил, что Математика переиспользует память, отведённую под конкретный символ, если ему присвоить другое значение.

Вторая проблема ТС обусловлена тем, что он использует новые символы в каждом блоке. Вообще, нужно следовать принципу DRY.

Кроме этого, есть замечательная команда Evaluate -> Quit/Start Kernel, которая перегружает ядро с полным высвобождением всей памяти.

P.S. все символы, которые участвуют в роли неизвестных в уравнении, должны быть свободными от значений (команды =. и Clear) прежде, чем передаются в FindRoot или любой другой аналогичный метод:
Код:
x = 2;
x =.;
system = ...
FindRoot[system, x];

 
 
 
 Re: Mathematica - очистка памяти
Сообщение01.09.2014, 16:53 
Mysterious Light в сообщении #902464 писал(а):
есть замечательная команда Evaluate -> Quit/Start Kernel, которая перегружает ядро с полным высвобождением всей памяти.
Вообще это то что надо. Только у меня она как две раздельные команды Quit Kernel и Start Kernel, в которых нужно еще выбрать Local во всплывающем подменю. Это довольно долго. Есть ли она объединенная именно как Quit/Start Kernel и есть ли для нее горячие клавиши? Есть ли аналоги этих команд в языке?

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

 
 
 
 Re: Mathematica - очистка памяти
Сообщение01.09.2014, 17:32 
Аватара пользователя
_Er в сообщении #902655 писал(а):
Mysterious Light в сообщении #902464 писал(а):
есть замечательная команда Evaluate -> Quit/Start Kernel, которая перегружает ядро с полным высвобождением всей памяти.
Вообще это то что надо. Только у меня она как две раздельные команды Quit Kernel и Start Kernel, в которых нужно еще выбрать Local во всплывающем подменю. Это довольно долго. Есть ли она объединенная именно как Quit/Start Kernel и есть ли для нее горячие клавиши? Есть ли аналоги этих команд в языке?
У меня тоже они разнесены, local — имя основного ядра, как я понял.
_Er в сообщении #902655 писал(а):
В самом языке математики предусмотрена команда Quit[] закрывающая все ядра. Только вот проблема в том, что, во-первых, аналогичной команды Start[] я не нахожу, а, во-вторых, после выполнения этой команды невозможно выполнение любой другой, до тех пор пока не будут запущены ядра через Evaluate -> Start Kernel.

Это и логично: программа (ядро) может себя закрыть, а вот как ядру себя отрыть, если оно закрыто? Иными словами, Start[] не может быть потому, что для ещё исполнения необходимо ядро, которого ещё нет по логике самой команды. Так что ручками... Горячих клавиш я не знаю.

 
 
 
 Re: Mathematica - очистка памяти
Сообщение01.09.2014, 17:37 
Когда вы попытаетесь что-то вычислить, ядро автоматически запустится (в восьмой версии с моими настройками, а я особо не настраивал, это, по крайней мере, так).

 
 
 
 Re: Mathematica - очистка памяти
Сообщение01.09.2014, 17:42 
Mysterious Light в сообщении #902678 писал(а):
Иными словами, Start[] не может быть потому, что для ещё исполнения необходимо ядро, которого ещё нет по логике самой команды.
Это, конечно, понятно, но вот команду QuitStartKernels[] или RestartKernels[], перезапускающую ядра в языке, наверное, можно было бы предусмотреть.
arseniiv в сообщении #902679 писал(а):
Когда вы попытаетесь что-то вычислить, ядро автоматически запустится (в восьмой версии с моими настройками, а я особо не настраивал, это, по крайней мере, так).
Хм. Проверял, вроде бы не запускается. Перепроверю еще раз, когда математика освободится. У меня 10я версия, может в этом дело.

-- 01.09.2014, 17:59 --

Mysterious Light в сообщении #902464 писал(а):
P.S. все символы, которые участвуют в роли неизвестных в уравнении, должны быть свободными от значений (команды =. и Clear) прежде, чем передаются в FindRoot или любой другой аналогичный метод:
Проверил. Действительно это так.
_Er в сообщении #902682 писал(а):
arseniiv в сообщении #902679 писал(а):
Когда вы попытаетесь что-то вычислить, ядро автоматически запустится (в восьмой версии с моими настройками, а я особо не настраивал, это, по крайней мере, так).
Хм. Проверял, вроде бы не запускается. Перепроверю еще раз, когда математика освободится. У меня 10я версия, может в этом дело.
Перепроверил. Если выделить все ячейки и выполнить их – символы ячеек справа висят "жирными", как будто бы выполняются, в течение 2-3 секунд и потом становятся обычными. При этом никаких результатов вычислений нет. В это же время можно выполнить отдельную ячейку и ядро запустится. После этого можно выполнять все остальное.

 
 
 
 Re: Mathematica - очистка памяти
Сообщение01.09.2014, 19:06 
Аватара пользователя
_Er в сообщении #902682 писал(а):
Mysterious Light в сообщении #902678 писал(а):
Иными словами, Start[] не может быть потому, что для ещё исполнения необходимо ядро, которого ещё нет по логике самой команды.
Это, конечно, понятно, но вот команду QuitStartKernels[] или RestartKernels[], перезапускающую ядра в языке, наверное, можно было бы предусмотреть.

Я не знаю внутреннего устройства Математики, далее идут мои догадки.
Математика состоит из визуальной оболочки и ядра — программы, которая проводит вычисления. Последнюю можно использовать из-под терминала и писать Вольфрам-скрипты для системных нужд. Визуальная оболочка обязана быть связаной с каким-то ядром. Закрытие ядра (в т.ч. Quit[]) приводит к закрытию ядра; если ядро было запущено из-под терминала, то передаётся управление терминалу, если перед нами скрипт, то он завершается, если оболочка — она просто остаётся текстовым редактором.

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

 
 
 
 Re: Mathematica - очистка памяти
Сообщение02.09.2014, 00:55 
Аватара пользователя
Если позволите, маленький совет. Не воспринимайте Mathematica как некую среду из которой выход закрыт. Используйте её по прямому назначению - как блокнот. Поэтому не стесняйтесь чёркать тыкать в Evaluation -> Quit Kernel и начинать всё заново.

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group