2015-05-26 18 views
7

Ho uno script che esegue molto più tempo di quanto mi aspettassi, è in esecuzione da 3 giorni e ha raggiunto solo il 55% di progresso.Pausa Matlab senza punto di interruzione

Sarei perfettamente felice di fermarlo a circa il 67% (posso vivere senza il restante 33%) Ma se lo interrompo ora (ctrl + c o ctlr + break), perderò tutti i dati.

Quindi c'è un modo per mettere in pausa Matlab, forse in modalità di debug in modo da poter controllare le variabili senza perdere i dati?

+3

Utilizzato implicitamente "cancella" nel programma per eliminare le variabili quando vengono arrestate? In caso contrario, ctrl + c terminerà il programma, ma le variabili potrebbero comunque essere accessibili tramite lo spazio di lavoro. Ti suggerisco di provare a scrivere un piccolo programma ed eseguirlo su un altro computer per testarlo. –

+1

ctrl-c non funziona sempre su Windows, se è uno script enorme, molto occupato, o single core, il segnale può scadere prima che lo script reagisca ..:/ – Henrik

+1

@Henrik Questo di solito accade quando il codice è una memoria così intensiva -wise o computazionale-saggio che nient'altro può essere fatto. Non si tratta di quanto tempo impiega il codice per eseguire. –

risposta

0

Presumo che si stia facendo qualcosa in modo iterativo e non facendo affidamento su una funzione MATLAB incorporata.

Il modo in cui risolvo di solito il problema è avere un contatore di iterazione e un'istruzione if su quel contatore: quando la condizione è soddisfatta, l'istruzione ha un punto di interruzione.

Qualcosa di simile a questo:

itCounter = 0; 
itHalt = 100; 
while (someCondition) 
    if (itCounter == itHalt) 
     itCounter = 0; %<= Put a breakpoint here 
    else 
     itCounter = itCounter+1; 
    end 

    % Here you calculate away whatever you need to calculate 
end 

In questo modo, in ogni iterazioni itHalt si ottiene un punto di interruzione. Inoltre, dal momento che abbiamo a che fare con MATLAB, puoi modificare il valore di HAL come meglio credi non appena viene raggiunto il punto di interruzione.

0

Sto pensando ad una soluzione alternativa:

Diamo uno script che fondamentalmente consiste in un ciclo principale.

Lo script scrive periodicamente informazioni sullo stato di esecuzione (ad esempio il numero di iterazioni eseguite) in un file di registro.

Inoltre, lo script legge periodicamente un numero dal file di input

1 meaning "continue" 
0 meaning "stop the script execution" 

All'inizio della simulazione, 1 è scritto nel file.

L'utente può leggere il registro e può decidere, a un certo punto, di interrompere lo script.

Per farlo, deve solo modificare 1 to 0 nel file come salvato.

Una sezione se esalta il valore letto su di esso.

If 1, nothing appens and the script continues running. 
If 0, a break statement terminates the main loop and the script stops. 

Poco prima della dichiarazione break, nella sezione di se, lo script salva l'intera area di lavoro in un file .mat.

L'utente ha ora accesso a MatLab (può evan chiudere MatLab) e può guardare, ad esempio, ai file di output generati fino a quel momento dallo script, elaborarli, creare grafici somo e così via.

Quindi potrebbe decidere di continuare l'esecuzione dello script dal punto in cui è stato interrotto.

Agli inizi dello script, una variabile controlla il modo in cui lo script deve essere eseguito:

Mode 0: start from the beginning 
Mode 1: resume the script 

Una sezione if - else maneggi la selezione dell'utente.

In particolare, se è selezionata la Modalità 1, lo script carica l'area di lavoro precedentemente salvata (memorizzata in un file .mat), quindi il valore di alcune variabili dello script viene impostato sui vecchi valori.

Ad esempio: lo script è stata interrotta quando l'indice del ciclo for è, per esempio, 100.

se il ciclo è definito come

for i=start_loop_1:100000 

nella modalità 1 del caso , start_loop_1 è impostato su i + 1 (il valore di i è stato salvato nel file .mat).

Ciò consente al loop di "continuare" l'esecuzione dal punto in cui è stata interrotta.

Al fine di "riprendere" in modo efficace l'esecuzione dello script, alcune altre variabili utilizzate nello script potrebbero richiedere di essere gestite allo stesso modo nella sezione Modalità 1.

in tha caso di un "grande", lo script "complicato" questo potrebbe essere difficile, ma non impossibile ...

Questa soluzione è stata implementata nel seguente script.

Vedo una potenziale criticità consistente nel caso sfortunato in cui l'utente salva il file contenente 1,0 nello stesso momento in cui lo script lo legge.

% 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 

Spero che questo aiuti.

0

OK, solo per riformulare quello che ho detto nei commenti con gli input degli altri utenti che hanno commentato. Se il tuo script è uno script MATLAB, (non una funzione), tutte le variabili saranno accessibili dallo spazio di lavoro purché tu non abbia esplicitamente chiamato 'clear' nello script se lo script è stato arrestato. Nel solito caso, ctrl + c terminerà lo script in esecuzione. Le variabili MATLAB utilizzate nello script saranno comunque accessibili da MATLAB Workspace.

2

Il comando (è necessario inserire manualmente prima di iniziare la vostra funzione!)

dbstop if error

dovrebbe prendere un Ctrl-C e si lascia in modalità debug.

0

Non penso che ci sia qualcosa che puoi fare mentre il codice è già in esecuzione, a meno che tu non abbia inserito alcuni ganci in anticipo. Alcuni di questi altri suggerimenti sono buoni per questo. Ecco un altro che mi piace: dite che state partendo per la notte, ma tornate il giorno dopo, quindi volete che il vostro codice funzioni per 14 ore e poi fermatevi e vi aspettate con tutti i dati a disposizione tempo.

start_time = now; 
final_time = start_time + 10/86400; % datenums are in days in Matlab, so +14/24 for 14 hours 
% alternative: final_time = datenum('12-Aug-2015 09:00:00'); 

while now < final_time 
    % do work 
    disp('Working...') 
    pause(1) 
end 

% potential clean up code to save results 
disp('Clean up code.') 
Problemi correlati