我使用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
释放已用过的内存,除非它没有。
有什么想法吗?
答案 0 :(得分:6)
确定。将此作为答案发布,因为我相信您使用版本5或更低版本的几率非常低:
`As of Version 6.0, MLDisownString() has been superseded by MLReleaseString()`
检查here
答案 1 :(得分:1)
首先,我应该指出$HistoryLength
这样的参数。将其设置为零通常可以显着降低内存需求:
$HistoryLength = 0
同时,已知MathKernel进程的问题是它在长计算中累积系统内存并且不释放它。
最终解决问题的唯一方法是在内存过多或可用空闲物理内存量变得太小时重启内核。此任务可以自动化。
如果您尚未尝试 Mathematica 8,则可能值得一试,因为,according to Oliver Ruebenkoenig:
对于版本8,内存分配器具有 被重写和改进。
(这么大的小句话 努力和如此精细的执行)
但我还没有尝试过版本8,也无法对其进行任何说明。