9
votes

Forcer matlab à recharger la bibliothèque liée à la fonction MEX

J'ai une fonction MEX, disons myfunction.mexmaci64 (qui est la fin correcte sur OS X).

Maintenant, la mycée est liée à une bibliothèque mylibrary.dylib . MEX-File et Bibliothèque, résident dans le même dossier.

Maintenant, chaque fois que je change quelque chose dans mylibrary , MATLAB ne rechargne pas la nouvelle version de la bibliothèque, mais utilise plutôt l'ancien jusqu'à ce que je redémarre Matlab. C'est très anoking lors du développement et du débogage des travaux. Existe-t-il un moyen de forcer Matlab à recharger la bibliothèque sans redémarrer l'application?

Remarque: il serait facile de lier la bibliothèque statiquement dans la fonction MEX. Cependant, lorsque je liez la même bibliothèque à travers quelques fichiers MEX, je préférerais conserver ma bibliothèque partagée unique pour réduire les délais de compilation et la redondance des données.

EDIT:

concernant La discussion que le Clear Mex aide: xxx

renvoie une liste avec tous les fichiers MEX chargés. Cette liste ne contient pas la bibliothèque liée, mais uniquement les fichiers MEX elle-même. Utilisation de Effacer Mex vide avec succès cette liste, mais ne décharge pas mylibrary - exécutant à nouveau la fonction MEX donne toujours la même sortie que celle avec l'ancienne bibliothèque partagée.


6 commentaires

nonchargé () être une option? mathworks.de/help/matlab/ref/unloadlibrary.html < / a>


@ H.muster peut-être nonchargé () pourrait aider, oui. Cependant, je ne vois pas comment l'utiliser. L'appelant juste avec le chemin de ma bibliothèque, il suffit de retourner Impossible de trouver le fichier myLibrary.dylib . En outre, la documentation répertorie également la limitation avec des bibliothèques chargées à l'aide de la fonction LoadLibrary. . Probablement le fichier MEX n'utilise pas loadlibrary (je ne fournis jamais un fichier d'en-tête requis pour LoadLibrary .


@Thilo, je n'ai eu que de traiter de décharger la fonction MEX elle-même, pas des bibliothèques qu'elle références. J'ai supposé que le système d'exploitation le déchargerait pour vous une fois que Matlab a déchargé le fichier MEX. Comment vous connectez-vous à mylibrary ? Est-ce que la lieur fait la liaison pour vous (lorsque vous compilez la fonction MEX) ou utilisez-vous dlopen () ? Si c'est ce dernier, vous devez appeler dlclose () . Peut-être enregistrer une fonction mexatexit où vous pouvez faire cet appel.


@Thilo: INMEM ne montre que des fonctions MEX chargées dans la mémoire non des dépendances externes. Sous Windows, vous pouvez utiliser DumpMemM pour voir toutes les DLL chargées par MATLAB (y compris la sienne)


Dupliqué possible de Fonction MEX non mise à jour après la récompille . La dernière fois que j'ai enquêté sur cela, je n'ai pas pu reproduire le problème. La conclusion était que la bibliothèque partagée liée ne publie pas toutes ses ressources, est donc restée en mémoire (ou que ce comportement est spécifique à la plate-forme, je l'ai testé sous Windows)


@Amro: Merci pour votre contribution. Il est fort probable que la bibliothèque ne libère pas tout peu de mémoire allouée. BDClose tout fonctionne pour l'instant. Une fois que j'ai un peu plus de temps, je vais enquêter un peu plus loin, cependant. Peut-être qu'un problème de ma bibliothèque est impliqué (que, dans le pire des cas, une cause d'autres problèmes que je ressens lorsque j'utilise la bibliothèque en dehors de Matlab).


3 Réponses :


1
votes

fait CLEE MEX Faites ce dont vous avez besoin?


2 commentaires

@Thilo Effacer est la bonne réponse, vérifiez la documentation de la syntaxe droite. Essayez Effacer ABS-PATH-TO-MEX-Fichier . Si rien ne fonctionne, Creusez via le fichier M pour la commande MEX pour voir comment Matlab décharge des fichiers MEX en mémoire lorsque vous recompilez une.


@PRAETORIAN: Clear Mex fonctionne, mais pas Effacer la bibliothèque partagée, mais uniquement le fichier MEX. En fait, je ne pouvais trouver aucune trace dans le mex.m (ou meilleur, mex_helper.m ) que les bibliothèques liées sont rechargées (recherche de décharge ou lib ne donne pas de succès significatif).



5
votes

Pour effacer une bibliothèque de la mémoire, j'ai généralement une bonne chance avec xxx pré>

puis si je me sens vraiment militant, je ferai: p>

bdclose all; % clear all libraries out of memory ( supposedly )
clear all;   % clear all workspace variables, mex, etc. ( supposedly )
rehash;      % cause all .m files to be reparsed when invoked again


2 commentaires

Thats insularess, bdclose est destiné à la fermeture des fenêtres Simulink, rien à voir avec les fichiers MEX (au moins non documenté) ..


Pour moi, bdclose tout; semble juste prendre un moment de départ Simulink, mais n'aide pas à recharger le MEX.



0
votes

Vous pouvez voir quelles bibliothèques partagées sont chargées en faisant:

version('-modules')  % test.mexa64 and test.so appear
clear test           % clear the mex file
version('-modules')  % both test.mexa64 and test.so no longer appear.


0 commentaires