Dans MATLAB, le passage d'argument à une fonction se fait par copie et non pas par adresse.
Donc en théorie, si on passe une variable qui prend N octets en mémoire, on se retrouve avec 2*N octets de mémoire utilisée, jusqu'à la fin de la fonction.
Mais MATLAB est assez malin pour éviter ceci, à la condition que les valeurs contenues dans la variable ne soient pas modifiées à l'intérieure de la fonction.
Cela fonctionne aussi en dehors des fonctions.
Voici un exemple qui crée un tableau X de 100 Mo puis une copie de ce tableau (donc 100 Mo plus en théorie) avec et sans modification :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| function test
clc
user = memory;
m0 = user.MemUsedMATLAB;
X = rand(1,13107200);
user = memory;
fprintf('Mémoire utilisée pour X : %.0f Mo\n', (user.MemUsedMATLAB-m0)/1024/1024)
Y = X;
user = memory;
fprintf('Mémoire utilisée pour X et Y=X : %.0f Mo\n', (user.MemUsedMATLAB-m0)/1024/1024)
Y(1) = 1;
user = memory;
fprintf('Mémoire utilisée si "Y(1)=1" : %.0f Mo\n', (user.MemUsedMATLAB-m0)/1024/1024)
clear Y
user = memory;
fprintf('Mémoire utilisée si "clear Y": %.0f Mo\n', (user.MemUsedMATLAB-m0)/1024/1024) |
Ce qui donne :
Mémoire utilisée pour X : 100 Mo
Mémoire utilisée pour X et Y=X : 100 Mo
Mémoire utilisée si "Y(1)=1" : 200 Mo
Mémoire utilisée si "clear Y": 100 Mo
Dans le cas des structures et des tableaux de cellules, chaque champs ou chaque élément se comporte à peu près comme un tableau indépendant.
En reprenant l'exemple précédent :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| function test
clc
user = memory;
m0 = user.MemUsedMATLAB;
X{1} = rand(1,13107200);
X{2} = rand(1,13107200);
user = memory;
fprintf('Mémoire utilisée pour X : %.0f Mo\n', (user.MemUsedMATLAB-m0)/1024/1024)
Y = X;
user = memory;
fprintf('Mémoire utilisée pour X et Y=X : %.0f Mo\n', (user.MemUsedMATLAB-m0)/1024/1024)
Y{1}(1) = 1;
user = memory;
fprintf('Mémoire utilisée si "Y{1}(1)=1" : %.0f Mo\n', (user.MemUsedMATLAB-m0)/1024/1024)
clear Y
user = memory;
fprintf('Mémoire utilisée si "clear Y": %.0f Mo\n', (user.MemUsedMATLAB-m0)/1024/1024) |
ce qui donne :
1 2 3 4
| Mémoire utilisée pour X : 200 Mo
Mémoire utilisée pour X et Y=X : 200 Mo
Mémoire utilisée si "Y{1}(1)=1" : 300 Mo
Mémoire utilisée si "clear Y": 200 Mo |
Lorsqu’on modifie l'élément Y{1}, seul cet élément est dupliqué en mémoire, pas la totalité du tableau de cellules.
Maintenant, si tu emploies des variables globales, il n'y a plus à tenir compte de ces effets. Les variables ne sont pas dupliquées.
Partager