7
votes

Pause Matlab sans point d'arrêt

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.

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.

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?


4 commentaires

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.


5 Réponses :


0
votes

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 si Déclaration sur ce compteur - lorsque la condition est remplie, la déclaration a un point d'arrêt.

quelque chose comme ceci: xxx

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é.


0 commentaires

0
votes

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> xxx pré>

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 1 à 0 code> dans le fichier comme sauvegardez-le. P>

une section If Edition de la valeur lue dessus. 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


0 commentaires

0
votes

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.


0 commentaires

2
votes

La commande (doit être entrée manuellement avant de démarrer votre fonction!)

dbstop si une erreur

devrait attraper un CTRL-C et vous laisser dans le mode de débogage.


0 commentaires

0
votes

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. XXX


0 commentaires