Я занимаюсь довольно длинными вычислениями, которые могут легко охватывать несколько дней. В ходе этих вычислений иногда у 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 очистить память, которую он использует? Я пробовал littering Share
и Clear
в течение многих Modules
, которые я использую в своем коде, но память все еще, кажется, накапливается с течением времени.
Я также попытался удостовериться, что у меня нет ничего большого и сложного, выполняющегося за пределами Module
, так что что-то не остается слишком длинным. Но даже при этом у меня все еще есть проблемы с памятью.
Есть ли что-нибудь, что я могу сделать по этому поводу? У меня всегда будет большой объем памяти, так как большинство моих вычислений связаны с несколькими большими и плотными матрицами (обычно 1200 x 1200, но это может быть больше), поэтому я с осторожностью отношусь к использованию MemoryConstrained
.
Update:
Проблема была именно в том, что сказал Алексей Попков в своем ответе. Если вы используете Module
, память со временем будет течь медленно. В этом случае это усугублялось, потому что у меня было несколько операторов Module[..]
. "Основной" Module
находился в пределах ParallelTable
, где сразу выполнялось 8 ядер. Отметьте (относительно) большое количество итераций, и это стало питательной средой для лотов утечек памяти из-за ошибки с Module
.