Я делаю довольно длинные вычисления, которые могут легко занять несколько дней.В ходе этих вычислений иногда Mathematica не хватает памяти.С этой целью я прибег к чему-то вроде:
ParallelEvaluate[$KernelID]; (* Force the kernels to launch *)
kernels = Kernels[];
Do[
If[Mod[iteration, n] == 0,
CloseKernels[kernels];
LaunchKernels[kernels];
ClearSystemCache[]];
(* Complicated stuff here *)
Export[...], (* If a computation ends early I don't want to lose past results *)
{iteration, min, max}]
Это здорово и все, но со временем основное ядро накапливает память.В настоящее время мое основное ядро потребляет примерно 1,4 ГБ ОЗУ.Могу ли я заставить Mathematica очистить память, которую она использует?Я пытался засорять Share
и Clear
во многих Modules
, которые я использую в своем коде, но со временем кажется, что память все еще увеличивается.
Я пытался также сделатьЯ уверен, что у меня нет ничего большого и сложного, работающего за пределами Module
, так что что-то не остается слишком долго.Но даже с этим у меня все еще есть проблемы с памятью.
Могу ли я что-нибудь сделать с этим?У меня всегда будет большой объем используемой памяти, так как в большинстве моих расчетов используются несколько больших и плотных матриц (обычно 1200 x 1200, но может быть и больше), поэтому я осторожен с использованием MemoryConstrained
.
Обновление:
Проблема была именно в том, что Алексей Попков заявил в своем ответе.Если вы используете Module
, память будет медленно течь со временем.Это обострилось в этом случае, потому что у меня было несколько Module[..]
заявлений.«Основной» Module
находился в пределах ParallelTable
, где одновременно работало 8 ядер.Придерживайтесь (относительно) большого количества итераций, и это стало почвой для лотов утечек памяти из-за ошибки с Module
.