Накопление памяти Mathlink - PullRequest
2 голосов
/ 17 июня 2011

Я использую MathLink для отправки и получения независимых выражений mma из C++ приложения в виде строк.

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 освобождает использованную память, за исключением того, что это не так.

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 17 июня 2011

Хорошо.Отправляя это как ответ, потому что я полагаю, что шансы, что вы используете версию 5 или ниже, довольно низки:

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

Проверьте это здесь

1 голос
/ 18 июня 2011

Прежде всего, я должен указать на такой параметр как $HistoryLength.Установка его в ноль часто позволяет значительно снизить требования к памяти:

$HistoryLength = 0

В то же время известна проблема с процессом MathKernel, которая накапливает системную память при длительных вычислениях и не освобождает ее.

Единственный способ окончательно решить проблему - перезапустить ядро, когда оно занимает слишком много памяти или когда объем доступной свободной физической памяти становится слишком маленьким.Эта задача может быть автоматизирована.


Если вы еще не пробовали Mathematica 8, возможно, стоит попробовать, так как, согласно Оливеру Рубенкенигу :

Для версии 8 распределитель памяти был переписан и улучшен.

(Какая маленькая фраза для такого огромного усилия и такого прекрасного исполнения)

Но я еще не пробовал версию 8 и ничего не могу сказать о ней.

...