我正在做一些相当长的计算,这可能很容易跨越几天.在这些计算过程中,有时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}]
Run Code Online (Sandbox Code Playgroud)
这很好,但是随着时间的推移,主内核会累积内存.目前,我的主要内核占用大约1.4 GB的RAM.有什么方法可以强迫Mathematica清除它正在使用的内存吗?我试过乱扔垃圾Share和Clear整个很多Modules,我用我的代码,但记忆似乎仍然在时间来建立.
我也试图确保在a之外没有任何大而复杂的运行Module,因此某些东西不会在范围内停留太长时间.但即便如此,我仍然有记忆问题.
我能做些什么吗?我总是会使用大量的内存,因为我的大多数计算涉及几个大而密集的矩阵(通常是1200 x 1200,但它可能更多),所以我对使用它很谨慎MemoryConstrained.
更新:
问题正是Alexey Popkov在他的回答中所说的.如果使用Module,内存会随着时间缓慢泄漏.在这种情况下,它恰好加剧了,因为我有多个Module[..]陈述."main" Module位于ParallelTable8个内核同时运行的位置.解决(相对)大量迭代问题,这是导致大量内存泄漏的滋生地Module.