我使用MathLink以字符串的形式从C++应用程序发送和接收独立的mma表达式。
std::string expression[N];
// ...
for(int i = 0; i < N; ++i) {
MLPutFunction(l, "EnterTextPacket", 1);
MLPutString(l, expression[i].c_str());
MLEndPacket(l);
// Check Packet ...
const char* result;
MLGetString(l, &result);
// process result ...
MLDisownString(l, result);
}我期望MLDisownString释放已使用的内存,但事实并非如此。
有什么想法吗?
发布于 2011-06-18 00:55:46
好的。将此作为答案发布,因为我认为您使用版本5或更低版本的几率非常低:
`As of Version 6.0, MLDisownString() has been superseded by MLReleaseString()`Check it
发布于 2011-06-18 16:36:24
首先,我应该指出像$HistoryLength这样的参数。将其设置为零通常可以显著减少内存需求:
$HistoryLength = 0同时,MathKernel进程的已知问题是它在长时间的计算中积累了系统内存,并且没有释放它。
最终解决这个问题的唯一方法是在内核占用太多内存或可用可用物理内存量变得太小时重新启动内核。这项任务可以自动化。
如果您还没有尝试过Mathematica 8,那么可能值得一试,因为according to Oliver Ruebenkoenig
版本8的
内存分配器已被重写和改进。
(对于如此巨大的努力和如此精细的执行来说,这是多么小的一句话)
但我还没有尝试过版本8,也不能对此发表任何意见。
https://stackoverflow.com/questions/6389014
复制相似问题