2

我用来MathLinkC++应用程序中以字符串形式发送和接收独立的 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释放已使用的内存,但它不会。

有任何想法吗?

4

2 回答 2

6

行。将此作为答案发布,因为我相信您使用版本 5 或更低版本的几率非常低:

`As of Version 6.0, MLDisownString() has been superseded by MLReleaseString()`

在这里检查

于 2011-06-17T16:55:46.163 回答
1

首先,我应该指出这样的参数$HistoryLength。将其设置为零通常可以大大减少内存需求:

$HistoryLength = 0

同时,MathKernel 进程的已知问题是它在长时间计算中积累系统内存并且不释放它。

最终解决问题的唯一方法是在内核占用过多内存或可用的可用物理内存量变得太小时时重新启动内核。该任务可以自动化。


如果您还没有尝试过Mathematica 8,那么可能值得一试,因为根据 Oliver Ruebenkoenig 的说法

对于版本 8,内存分配器已被重写和改进。

(对于如此巨大的努力和如此出色的执行来说,这是多么小的一句话)

但我还没有尝试过版本 8,也不能说什么。

于 2011-06-18T08:36:24.077 回答