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.
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. –
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
@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. –