Тодд Гейли ответил на мой вопрос в группе новостей.Решение состоит в том, чтобы отправить подчиненному ядру MLTerminateMessage
.Из кода верхнего уровня:
LinkInterrupt[link, 1] (* An undocumented form that lets you pick
the message type *)
В C:
MLPutMessage(link, MLTerminateMessage);
В Java с использованием J / Link:
link.terminateKernel();
В .NET с использованием .NET /Ссылка:
link.TerminateKernel();
РЕДАКТИРОВАТЬ:
Я обнаружил, что в стандартных случаях при использовании LinkInterrupt[link, 1]
моя операционная система (в настоящее время Windows 2000) освобождает физическую памятьтолько через 0,05-0,1 секунды, начиная с момента выполнения LinkInterrupt[link, 1]
, тогда как при LinkClose[link]
она освобождает физическую память за 0,01-0,03 секунды (оба значения включают время, затраченное на выполнение самой команды).Временные интервалы были измерены с использованием SessionTime[]
в равных условиях и постоянно воспроизводятся.
На самом деле мне нужна функция в Mathematica , которая возвращается только тогда, когда процесс подчиненного ядра уже завершен иего память уже выпущена.И LinkInterrupt[link, 1]
, и LinkClose[link]
не ждут выхода из подчиненного ядра.На данный момент единственной такой функцией, по-видимому, является killProc[procID]
функция, которую я показал в другом ответе на этой странице.