J'ai un script qui fonctionne beaucoup plus de temps que prévu, il fonctionne depuis 3 jours et n'a atteint que 55% de progrès. P>
Je serais parfaitement heureux de l'arrêter à environ 67% (je peux vivre sans les 33% restants), mais si je l'arrêtez maintenant (Ctrl + C ou CTLR + Pause), je perdrais toutes les données. p>
Voilà donc un moyen de mettre en pause Matlab, peut-être en mode de débogage afin que je puisse vérifier les variables sans perdre de données? p>
5 Réponses :
Je suppose que vous faites quelque chose d'itération ici et ne comptez pas sur une fonction MATLAB intégrée.
La façon dont je résolvez habituellement le problème que vous avez d'avoir un compteur d'itération et un quelque chose comme ceci: p> de cette façon, dans chaque ithalt itérations vous obtenez un point d'arrêt. De plus, étant donné que nous traitons avec MATLAB, vous pouvez modifier la valeur de Ithalt comme vous le voyez dès que le point d'arrêt est touché. P> p> si code > Déclaration sur ce compteur - lorsque la condition est remplie, la déclaration a un point d'arrêt. P>
Je pense à une solution alternative:
Avoir un script qui consiste essentiellement en une boucle principale. P>
Le script écrit périodiquement des informations sur l'état d'exécution (par exemple, le nombre d'itérations effectuées. ) dans un fichier journal. p>
En outre, le script lit périodiquement un numéro à partir du fichier d'entrée p> au début de la simulation, 1 est écrit Dans le fichier. p> L'utilisateur peut lire le journal et peut décider, à un moment donné, d'arrêter le script. P> Pour le faire, il doit juste changer une section If Edition de la valeur lue dessus. P> 1 à 0 code> dans le fichier comme sauvegardez-le. P> % Flag to select the running mode
% Mode 0: start from the beginning
% Mode 1: resume the running
continue_my_script=1;
% if "Mode 1" has been selected, the "old" workspace is loaded and some
% variables are properly set
if(continue_my_script == 1)
load my_script_data
start_loop_1=i+1;
start_loop_2=1;
% if Mode 0 has been selected some variables are set to their default value
else
start_loop_1=1;
start_loop_2=1;
% counter to enable writing of the log file
cnt_log=0;
% counter to enable reading the "go / no go" input file
cnt_go=0;
end
% Definition of the condition for writing the log file (in this case, a
% certain number of iterations")
log_iter=13;
% Definition of the condition for reading the "go / no go" input file (in
% this case, a certain number of iterations")
go_nogo_iter=20;
% Starting point of the "real script"
for i=start_loop_1:100000
% Increment the log counter
cnt_log=cnt_log+1;
% if "log_iter" have been done, update the log file
if(cnt_log == log_iter)
cnt_log=0;
t=clock;
fp=fopen('my_script_log.log','wt');
fprintf(fp,'i= %d at %d %d %f\n',i,floor(t(4)),floor(t(5)),t(6));
fclose(fp);
end
% Another loop of the script
for j=start_loop_2:100000
a(i,j)=sqrt(i);
end
% Increment the "read input file" counter
cnt_go=cnt_go+1;
% if "go_nogo_iter" have been done, read the go_nogo input file
if(cnt_go == go_nogo_iter)
cnt_go=0;
fp1=fopen('my_script_go.log','rt');
go_nogo=fscanf(fp1,'%d');
fclose(fp1);
% If the user made the decision to stop the execution, save the workspace
% and exit; otherwise ... do noting, just continue running
if(go_nogo == 0)
save my_script_data
break;
end
end
end
D'accord, juste pour reformuler ce que j'ai dit dans les commentaires avec des intrants d'autres utilisateurs qui ont commenté. Si votre script est un script MATLAB (pas une fonction), toutes les variables seront accessibles à partir de l'espace de travail aussi longtemps que vous n'avez pas explicitement appelé «Effacer» dans le script si le script est arrêté. Dans le cas habituel, Ctrl + C mettra fin au script en cours d'exécution. Les variables MATLAB utilisées dans le script seront toujours accessibles à partir de l'espace de travail MATLAB. p>
La commande (doit être entrée manuellement avant de démarrer votre fonction!) p>
devrait attraper un CTRL-C et vous laisser dans le mode de débogage. p> dbstop si une erreur code> p>
Je ne pense pas que vous puissiez faire quelque chose pendant que le code est déjà en cours d'exécution, à moins que vous ne mettez des crochets à l'avance à l'avance. Certaines de ces autres suggestions sont bonnes pour cela. Voici un autre que j'aime: dites que vous partez pour la nuit, mais revenez le lendemain, vous souhaitez donc que votre code fonctionne pendant 14 heures, puis arrêtez-vous et vous attendez avec beaucoup de données qu'il a eu à temps.
Avez-vous utilisé implicitement «Clear» dans votre programme pour supprimer les variables lors de l'arrêt? Sinon, CTRL + C mettra fin à votre programme, mais les variables peuvent toujours être accessibles via l'espace de travail. Je vous suggère d'essayer d'écrire un petit programme et de l'exécuter sur un autre ordinateur pour le tester.
Ctrl-C ne fonctionne pas toujours sur Windows, s'il s'agit d'un script énorme, très occupé ou un noyau unique, le signal peut délai avant que le script réagit .: /
@Henrik qui arrive généralement lorsque le code est si intensément sage de mémoire ou de calcul que rien d'autre ne peut être fait. Ce n'est pas environ combien de temps le code prend pour exécuter.
@Vanling merci! Vous avez raison, j'exécute le même script sur un ordinateur différent, puis CTRL + C après un certain temps. Toutes les données étaient dans l'espace de travail! C'est une bonne chose que je gère un script et non une fonction ... sinon cela ne fonctionnerait pas.