Memory 限制内存使用的正确方法?

Memory 限制内存使用的正确方法?,memory,wolfram-mathematica,allocation,cap,Memory,Wolfram Mathematica,Allocation,Cap,在32位操作系统下,分配给任何一个程序的最大内存是有限的,Mathematica会优雅地终止内核并返回最大内存分配错误 然而,在64位操作系统上,Mathematica将自由使用所有可用内存,并使系统停止运行。因此,限制内存使用的正确方法是什么?可以将MemoryConstrained与$Pre或CellEvaluationFunction结合使用,但我不希望为了这个目的而将这两种功能捆绑在一起,或者必须修改现有的用途以合并此功能 是否有其他方法可以全局限制内存使用,例如内核标志或system$

在32位操作系统下,分配给任何一个程序的最大内存是有限的,Mathematica会优雅地终止内核并返回最大内存分配错误

然而,在64位操作系统上,Mathematica将自由使用所有可用内存,并使系统停止运行。因此,限制内存使用的正确方法是什么?可以将
MemoryConstrained
$Pre
CellEvaluationFunction
结合使用,但我不希望为了这个目的而将这两种功能捆绑在一起,或者必须修改现有的用途以合并此功能

是否有其他方法可以全局限制内存使用,例如内核标志或system$选项?

在Mathematica 8中,您可以启动内存监视器,大致如下:

maxMemAllowed        = 15449604;
intervalBetweenTests = 1; (*seconds*)
iAmAliveSignal       = 0;
Dynamic[iAmAliveSignal]
RunScheduledTask[
       If[MemoryInUse[] > maxMemAllowed , Quit[], iAmAliveSignal++],      
       intervalBetweenTests];
记得跑

RemoveScheduledTask[ScheduledTasks[]];
禁用它

编辑

您可以在退出前提醒或以交互方式决定要做什么。 根据要求,这里是一个分配了1.3GB的试用版。在这台机器里,我再也走不远了

maxMemAllowed = 1.3 1024^3; (*1.3 GB*)
intervalBetweenTests = 1; (*Seconds*)
iAmAliveSignal = 0;
leyendToPrint = "";
Dynamic[leyendToPrint]
RunScheduledTask[
  If[MemoryInUse[] > maxMemAllowed, 
   CreateDialog[CancelButton["Max Mem Reached", DialogReturn[]]]; 
   Quit[],
   Print["Memory in use: ", MemoryInUse[]]; 
   leyendToPrint = 
    "Seconds elapsed = " <> ToString[iAmAliveSignal++]], 
  intervalBetweenTests];
IntegerPartitions[320, {15}];
maxMemAllowed=1.3 1024^3;(*1.3 GB*)
测试间隔=1;(*秒*)
iAmAliveSignal=0;
leyendToPrint=“”;
动态[LeyendTopPrint]
运行计划任务[
如果[MemoryUse[]>maxMemAllowed,
CreateDialog[CancelButton[“已达到最大内存”,DialogReturn[]];
退出[],
打印[“正在使用的内存:”,内存使用[];
leyendToPrint=
“已用秒数=“ToString[iAmAliveSignal++]”,
参与者之间的间隔];
整数分[320,{15}];

一个好的操作系统应该能够向用户程序展示其资源的管理视图,包括CPU和内存。我刚才说的是好的操作系统;)。。。不,我真的不知道Win7OS x还允许mma将其暂停,而且,从我使用它时的回忆来看,Linux也允许(但从那时起情况可能已经发生了变化)。“这是一个很好的问题。”先生,我想这是可以做到的,但不是没有一些pain@Mr.也许可以通过使用
NETLink
从Mathematica内部使用。如果我们能得到确认,这在其他操作系统中也能正常工作,我将接受答案。再次感谢。@belisarius+1有趣的想法。如果前一个会话不是新的MathKernel会话,是否可以扩展此函数以使用相同或新的代码重新启动内核?@Alexey我真的不知道:(@belisarius我已经创建了单独的问题:“可笑的是,程序本身没有限制内存使用的选项。11个版本仍然存在同样的问题。