gpt4 book ai didi

Mathematica 中的异步计算

转载 作者:行者123 更新时间:2023-12-04 03:15:46 31 4
gpt4 key购买 nike

有时,当我在 Mathematica 中编写实验代码时,我担心是否应该对其进行评估,因为它最终可能会使我的系统瘫痪。

作为一个人为的例子,如果您尝试在 64 位机器上运行以下代码片段,它很可能会导致您的系统在耗尽所有内存后完全停止。

junk = Table[{x, x}, {10^9}]; (* nom nom nom memory. Please don't run this. *)

当然,你可以直接扔 MemoryConstrained并希望得到最好的结果,但有时您不希望它阻止任何进一步的输入。为此,我认为实现中间立场的最佳方式是在单独的内核中执行评估。

这很容易做到:
ClearAll[GetAvailableKernel];
GetAvailableKernel[] := Block[{i, kernels},
kernels = Kernels[];
If[Length@kernels != 0,
For[i = 1, i <= Length@kernels, i++,
If[kernels[[i, 1, 2]] > 0, Return@kernels[[i]]]
]
];
LaunchKernels[1]]

ClearAll[SafeEvaluate];
SetAttributes[SafeEvaluate, HoldFirst];
Options[SafeEvaluate] = {"EvaluationKernel" -> Null,
"ConstrainMemory" -> True, "MaxMemory" -> 2 1024^3};

SafeEvaluate[expr_, OptionsPattern[]] := Block[{evalkernel, result},
If[OptionValue["EvaluationKernel"] != Null,
evalkernel = OptionValue["EvaluationKernel"],
evalkernel = GetAvailableKernel[]
];

result = If[OptionValue["ConstrainMemory"],
With[{memory = OptionValue["MaxMemory"]},
ParallelEvaluate[MemoryConstrained[expr, memory], evalkernel]],
ParallelEvaluate[expr, evalkernel]];
result]

然后你可以继续做一些事情:
SafeEvaluate[Table[{x, x}, {1024^3}]]

Mathematica 会优雅地返回 $Aborted告诉你它的内存不足。通过在单独的内核中进行评估,我们可以将代码沙箱化到它自己的并行内核中。如果出现问题,那么我们的主内核不会受到影响。

这让我想到了我的主要观点: 如何在 Mathematica 中实现异步计算?

我现在的工作,但它完全阻止任何进一步的用户输入。我不能只是设置,忘记,然后再检查。

有什么想法吗?

最佳答案

我在 Mathematica 中的并行计算经验几乎为零,所以这可能不是最好的方法,但这是我设法挖掘出来的 from the docs :

启动内核:

In[1]:= LaunchKernels[1]

Out[1]= KernelObject[1, "local"]

提交一些需要完成的工作:
In[2]:= job = 
ParallelSubmit[First@SingularValueList[RandomReal[1, {2000, 2000}]]]

Mathematica graphics

开始工作:
In[3]:= Parallel`Developer`QueueRun[]

Out[3]= True

现在作业在后台并行运行......

Mathematica graphics

...我们可以在主内核中自由地做我们想做的任何事情。如果我理解你的问题,这就是你所需要的。我们可以运行 Parallel`Developer`QueueRun[]再次检查哪些并行评估已经完成(评估对象的显示会动态更新)。
In[4]:= 1 + 1

Out[4]= 2

等到评估完成(如果还没有)并收集结果:
In[5]:= WaitAll[job]

Out[5]= 1000.23

Mathematica graphics

关于Mathematica 中的异步计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8516043/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com