MATLAB R2018a(64位)的默认堆栈大小是多少?
似乎堆栈大小大于64位C#程序。
我为什么要问
我之所以问这个问题,是因为我称英特尔MKL LAPACKE_dtrtri为高度递归。
我在.NET应用程序中使用该函数,并且从C#调用该函数时出现堆栈溢出错误,请参见What is the stack size of a BackgroundWorker DoWork Thread? Is there way to change it?
另一方面,如果我从MATLAB调用.NET应用程序,则不会收到堆栈溢出错误。这就是我想知道MATLAB的堆栈大小的原因。
答案 0 :(得分:4)
使用GetCurrentThreadStackLimits
中的kernel32.dll
函数,可以获得MATLAB的堆栈大小。
我已经在名为IntelMKL.dll
的.NET程序集中创建了以下辅助方法:
static class _kernel
{
[DllImport("kernel32.dll")]
internal static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit);
}
和
public static class MKL
{
public static uint GetStackSize()
{
uint low, high;
_kernel.GetCurrentThreadStackLimits(out low, out high);
return high - low;
}
}
我可以使用以下代码从MATLAB调用GetStackSize
:
NET.addAssembly('IntelMKL.dll')
IntelMKL.MKL.GetStackSize() % this return 67108864 Bytes which is 64 Mega Bytes
MATLAB的堆栈大小为64 MB。
似乎堆栈大小大于64位C#程序。
默认的C#堆栈大小为1 MB(32位)和4 MB(64位),请参见What is the stack size of a BackgroundWorker DoWork Thread? Is there way to change it?
答案 1 :(得分:1)
使用dumpbin命令可以查看MATLAB.exe
的标题。
dumpbin /headers "C:\Program Files\MATLAB\R2018a\bin\win64\MATLAB.exe"
这将返回
Dump of file C:\Program Files\MATLAB\R2018a\bin\win64\MATLAB.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
8664 machine (x64)
...
OPTIONAL HEADER VALUES
...
4000000 size of stack reserve
1000 size of stack commit
100000 size of heap reserve
1000 size of heap commit
size of stack reserve
是十六进制的堆栈大小。
因此,MATLAB的堆栈大小为67108864字节,即64兆字节。
答案 2 :(得分:0)
尽管我没有直接回答您的问题,但是可以通过get(0,'RecursionLimit')
或set(0,'RecursionLimit',N)
设置MATLAB的递归限制。
我相信除此之外,MATLAB会一直存储变量,直到您的RAM用完为止,但不是100%肯定。