MATLAB Garbage Collector?
Quel est votre modèle mental de celui-ci? Comment est-il mis en œuvre? Qui des forces et des faiblesses a-t-elle? MATLAB GC vs Python GC?
Je vois parfois étrange goulots d'étranglement des performances lors de l'utilisation de MATLAB fonctions imbriquées dans le cas contraire innocemment à la recherche de code, je suis sûr que c'est à cause de la cg. Garbage Collector est une partie importante de VM et de Mathworks ne pas le rendre public.
Ma question est à propos de MATLAB propre segment et GC! Pas au sujet de la manipulation de Java/objets COM /prévention de la "mémoire" des erreurs /affectation des variables de pile.
EDIT: la première réponse est en fait le méta-réponse "Pourquoi devrais-je m'en soucier?". Je fais des soins, car GC se manifeste lors de la mise en œuvre de liste liée ou MVC modèle.
- Python n'est pas réellement un garbage collector. Tout Disponible (le standard de référence de mise en œuvre que vous obtenez de python.org) est une référence compté. Il est possible que Matlab est mise en œuvre de cette façon aussi, mais je n'ai pas vraiment knoow. Êtes-vous posant cette question à décider de l'utilisation de Matlab ou Python, ou juste par curiosité?
- Je suis en désaccord avec vous - Comptage de Référence est l'un des mécanismes utilisés pour la GC.
- Sans entrer dans trop d'argument à savoir si le comptage de référence est une forme de nettoyage de la, je pense que quand vous dites que la collecte des ordures, vous impliquer marque/balayage, copie, ou un hybride des algorithmes utilisés par Java et .NET. Ou du moins, c'est la façon dont beaucoup de gens la prennent.
Vous devez vous connecter pour publier un commentaire.
C'est la liste des faits que j'ai recueillis. Au lieu de GC le terme de la mémoire (de)l'allocation semble être plus appropriée dans ce contexte.
Ma principale source d'information est le blog de Loren (en particulier ses commentaires) et cette article de MATLAB Digérer.
En raison de son orientation pour le calcul numérique avec possibilité de grands ensembles de données, MATLAB ne fait vraiment du bon travail sur l'optimisation de la empiler des objets de performance à l'aide de en place des opérations sur les données et call-by-reference sur les arguments de la fonction. Aussi en raison de son orientation son modèle de mémoire est fondamentalement différentes de ces langages à objets comme Java.
MATLAB avait pas officiellement défini par l'utilisateur de segment de mémoire jusqu'à la version 7 (dans la version 6, il y avait des sans-papiers
reference
fonctionnalité dansschema.m
fichiers). MATLAB 7 a des tas à la fois dans la forme de fonctions imbriquées (fermetures) et de manipuler des objets, leur mise en œuvre partagent les mêmes fondements. Comme une note de côté OO pourrait être des émules avec fermetures en MATLAB (intéressant pour les pré-2008a).De façon surprenante, il est possible de considérer l'ensemble de l'espace de travail de la fonction englobante capturé par la fonction de poignée (fermeture), voir la fonction fonctions(fhandle) dans MATLAB Aider. Cela signifie que les entourant de l'espace de travail est congelés dans la mémoire. C'est pourquoi
cellfun/arrayfun
sont parfois très lent lorsqu'il est utilisé dans les fonctions imbriquées.Il existe également des postes intéressants en Loren et Brad Phelan sur le nettoyage de l'objet.
Le fait le plus intéressant à propos de désallocation de tas dans MATLAB est, à mon avis, que MATLAB essaie de le faire chaque fois que la pile est en train d'être libéré, c'est à dire en sortant de chaque fonction. Cela a avantages mais c'est aussi un énorme PROCESSEUR de pénalité si tas libération est lente. Et il est effectivement très lent dans MATLAB dans certains scénarios!
Les problèmes de performances de MATLAB libération mémoire qui peuvent frapper code sont assez mauvais. J'ai toujours remarqué que j'ai involontairement introduire une cyclique références dans mon code quand il va tout d'un coup x20 plus lent et parfois besoin de quelques secondes entre la fin de la fonction et de retourner à son appelant (temps passé sur le nettoyage). C'est un problème connu, voir Dave Foti et cet ancien post sur le forum le code qui est utilisé pour faire cette photo de la visualisation de la performance (tests sont effectués sur des machines différentes, de manière absolue calendrier comparaison des différentes versions de MATLAB est vide de sens):
Augmentation linéaire de la taille du pool pour référence les objets, les moyens polynôme (ou exponentielle) diminution de MATLAB performance! Pour la valeur des objets de la performance est, comme prévu, linéaire.
Compte tenu de ces faits, je ne peux que spéculer que MATLAB utilise pas encore très efficace forme de de comptage de référence pour des tas de libération de la mémoire.
MODIFIER: j'ai toujours rencontré des problèmes de performances avec de nombreuses petites fonctions imbriquées, mais récemment, j'ai remarqué qu'au moins avec 2006a le nettoyage d'un unique imbriquée portée avec quelques mégaoctets de données est aussi terrible, il prend 1,5 secondes juste pour définir imbriquée portée de la variable est vide!
EDIT 2: j'ai enfin obtenu la réponse - par Dave, lui-même Foti. Il reconnaît les défauts, mais dit que MATLAB va conserver son présent nettoyage déterministe approche.
Légende: réduction des temps d'exécution est mieux
MATLAB rend l'espace de travail très clair dans l'explorateur d'espace de travail ou de "whos de la commande". Cela vous montre tous les objets créés par vos commandes et la quantité de mémoire qu'ils prennent.
va vous montrer le plus grand bloc contigu de mémoire disponible pour MATLAB, ce qui signifie que c'est le plus grand de la matrice, vous pouvez créer. À l'aide de la commande "clear" sera synchrone de supprimer les objets de la mémoire et de libérer de l'espace pour être utilisé à nouveau.
La JVM gère la collecte des ordures seulement de Java éléments. Donc, si vous ouvrez un fichier dans l'éditeur et de la fermer Java prend soin de supprimer la fenêtre et le texte, etc à partir de la mémoire. Si vous créez un objet Java dans l'espace de travail de MATLAB, il doit être effacé et alors il peut être nettoyé par la jvm.
Il y a beaucoup d'informations à propos de la gestion de la mémoire de programme dans notre note technique: http://www.mathworks.com/support/tech-notes/1100/1106.html
Et j'ai récemment écrit à propos de la manipulation de la mémoire par Java sur le MATLAB Bureau blog: http://blogs.mathworks.com/desktop/2009/08/17/calling-java-from-matlab-memory-issues/
Si vous êtes intéresse sur le plan scolaire qu'advient-il de la mémoire allouée quand une fonction se termine ou lorsque vous redimensionnez une variable...je suis assez sûr que c'est un secret de commerce et il change à chaque version. Vous ne devriez jamais c'est un avis, et si vous rencontrez des problèmes de performances que vous pensez sont liés à l'objet managmenet, veuillez soumettre un ticket d'aide avec le soutien technique: http://www.mathworks.com/support
Il semble que vous essayez de construire une sorte de Python vs MATLAB argument. Je ne suis pas intéressé par cet argument.
Une méta-réponse à votre méta-question.
C'est en fait assez important que vous n'avez pas de soins. Quand je dis cela, je ne veux pas limiter à MATLAB de gestion de la mémoire. Cela s'étend à Python, Java, .NET et de toute autre langue qui n'allocation dynamique de la mémoire et est encore en développement actif.
Le plus vous en savez sur le mécanisme actuel de la gestion de la mémoire, plus vous aurez de chance de code défensivement contre que la mise en œuvre spécifique, le plus probable, il en devient que vous ne bénéficiez pas de l'avenir des améliorations de performances. Un certain nombre de bons exemples de ce qui peut être trouvé dans de Java gc habilement écrite par Brian Goetz plus à developerworks.com:
http://www.ibm.com/developerworks/library/j-jtp01274.html
Vous pouvez dire que c'est important de le savoir. Je contre qui il est tout au sujet des exigences. La question la plus appropriée est, ne les langues que j'envisage pour mon projet, répondre à mes besoins en termes de performance, l'effort de développement, de la maintenabilité, portabilité, l'expertise de mes développeurs, etc, etc?
Je n'ai jamais vu un projet avec une exigence pour l'aide aux jeunes générations les gc sur la marque de balayer ref comptage. Je ne m'attends pas à voir un bientôt.