2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Mathematica - очистка памяти
Сообщение31.08.2014, 20:17 


24/07/14
138
Предусмотрена ли в Mathematica возможность полностью очистить всю память используемую программой? Т.е. очистить всё, что программа назанимала в результате последних вычислений.

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

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

 Профиль  
                  
 
 Re: Mathematica - очистка памяти
Сообщение31.08.2014, 22:52 
Заслуженный участник


25/02/11
1797
Переменная $HistoryLength хранит количество последних вычислений, которые математика помнит. Команда $HistoryLength = 0 говорит математике не запоминать результаты вычислений. В случае большого количества команд это часто спасает от переполнения памяти.

 Профиль  
                  
 
 Re: Mathematica - очистка памяти
Сообщение31.08.2014, 23:35 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
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 


24/07/14
138
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 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
_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 
Заслуженный участник


27/04/09
28128
Когда вы попытаетесь что-то вычислить, ядро автоматически запустится (в восьмой версии с моими настройками, а я особо не настраивал, это, по крайней мере, так).

 Профиль  
                  
 
 Re: Mathematica - очистка памяти
Сообщение01.09.2014, 17:42 


24/07/14
138
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 
Аватара пользователя


29/05/11
227
Красноармейск, Донецкая обл.
_Er в сообщении #902682 писал(а):
Mysterious Light в сообщении #902678 писал(а):
Иными словами, Start[] не может быть потому, что для ещё исполнения необходимо ядро, которого ещё нет по логике самой команды.
Это, конечно, понятно, но вот команду QuitStartKernels[] или RestartKernels[], перезапускающую ядра в языке, наверное, можно было бы предусмотреть.

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

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

 Профиль  
                  
 
 Re: Mathematica - очистка памяти
Сообщение02.09.2014, 00:55 
Заслуженный участник
Аватара пользователя


15/10/08
30/12/24
12599
Если позволите, маленький совет. Не воспринимайте Mathematica как некую среду из которой выход закрыт. Используйте её по прямому назначению - как блокнот. Поэтому не стесняйтесь чёркать тыкать в Evaluation -> Quit Kernel и начинать всё заново.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group