Является ли память, используемая MATLAB через вызовы через .NET, независимой от приложения .NET? - PullRequest
2 голосов
/ 22 февраля 2012

Причина, по которой я спрашиваю, состоит в том, что у меня есть приложение, которое (помимо прочего) вызывает компонент MATLAB .NET всякий раз, когда данные записываются в определенный файл. Компонент читает файл и создает изображение из данных, содержащихся в нем. Это отлично работает.

Однако, когда я использую базовое приложение для дополнительной обработки «значительного» объема данных и отображения обработанных данных в таблице, вызов MATLAB вызывает исключение нехватки памяти, но только когда я обрабатываю этот большой объем данные.

Разве это не признак того, что вызываемый процесс MATLAB будет полагаться на доступную память приложения? Наверное, я просто не понимаю, как работает память MATLAB при вызове с точки зрения .NET.

(Следует также отметить, что я вызываю clear all перед каждым вызовом функции MATLAB в попытке «начать с нуля», но это не сработает независимо)

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Никогда не использовал MATLAB из C#, но насколько я вижу, он использует COM компоненты для взаимодействия с CLR миром.Вы загружаете MATLAB неуправляемые DLL в свою кучу памяти процесса.И учитывая, что для CLR процесса на 32-битных машинах у вас есть приблизительно 1,2 ГБ памяти, поэтому вы выходите из этого доступного пространства.

Некоторое интересное описание того, как осуществляется загрузка неуправляемого компонента COM в управляемую память, вы можете найти здесь: Управление памятью неуправляемого компонента с помощью CLR

1 голос
/ 22 февраля 2012

COM компоненты, построенные на Matlab Builder NE, являются действующими COM серверами. Это означает, что они DLL s загружаются в область памяти вашего приложения. Это означает, что MCR, который является своего рода Matlab-Virtual-Machine, находится в вашем пространстве памяти.

Я считаю, что .NET компоненты должны вести себя точно так же.

1 голос
/ 22 февраля 2012

Вполне возможно, и из того, что вы описали, даже вероятно, что компонент MATLAB использует неуправляемую память (память, которая не управляется сборщиком мусора .NET). Вы можете сделать очень мало это, кроме того, что вы будете подавать ожидаемые данные только в ожидаемых количествах. Вы также можете создать заявку в службу поддержки MATLAB, если считаете, что используете ее правильно.

...