Is there a way for breaking a loop iteration, if it takes to long?
Mostra commenti meno recenti
Dear People, I am running analyzes of multiple input data files. Each file is analyzed in one iteration of a for loop, e.g.
for 1:length(data)
analyze(data{i});
end
However, for some data, the analysis takes very long, because the RAM is full. Is there a way of breaking the loop on a timer or RAM condition, say after 1 hour of iteration time, or as RAM gets full? Or do you have any other recommendation, except for throughing the data away in advance, or tuning the analysis?
Kind regards, Philipp
Risposte (2)
Jan Orwat
il 7 Giu 2016
One of the simplest ways for time control is to use tic and toc
time0 = tic;
timeLimit = 60*60*1; % 1 hour == 3600 seconds
for ...
...
if toc(time0)>timeLimit
break
end
end
or using while loop
time0 = tic;
timeLimit = 60*60*1; % 1 hour == 3600 seconds
while conds && toc(time0)<timeLimit
...
end
in case of placing multiple breakpoints it is vital to identify them e.g. by printing breakpoint info. It is crucial to design breakpoints in a way allowing to resume computations from the point it was disrupted. Sometimes instead of command break it is better to put a message and a debbuger breakpoint which will give you command line access while program is paused. Then you can continue from this exact point in code.
6 Commenti
Philipp
il 7 Giu 2016
I thought it doesn't split the function. This wouldn't work for you?
t0 = toc;
tLimit = 3600;
for i = 1:length(data),
analyze(data{i});
if toc(t0)>tLimit, break; end
end
You can return later changing one line:
for i = whereIStopped:length(data)
Or do you want to stop the function "analyze" from further operation if it takes too long, and switch it off during operation?
Jingying Wang
il 14 Nov 2017
I have the same Problem but I want to stop the function "analyze", or better to break the "for" circle. You know how?
Gauri Kant
il 17 Giu 2021
This method still requires the function to terminate. I have a numerical optimisation function in the for loop that requires convergence. However, for one particular iteration, if there is no convergence within 5 mins, I wish to skip that iteration and move to the next. Any clue as to how that might be possible?
Walter Roberson
il 17 Giu 2021
Use the Parallel Computing Toolbox.
Use parfeval() to start the computation of an interation. This will return a "future", which is a reference to a process. Use wait() to wait for the "future" with a timeout. If the timeout is encounted, then cancel() the "future"
This is pretty much the only method that MATLAB provides to kill a computation without the cooperation of the computation.
Gauri Kant
il 18 Giu 2021
@Walter Roberson Thanks! This actually helped me!
Jos (10584)
il 7 Giu 2016
Modificato: Jos (10584)
il 7 Giu 2016
You can create a timer ;
th = timer('TimerFcn','keyboard') ;
th.StartDelay = 5 ;
start(th) ;
pause ; % will be stopped after 5 seconds.
stop(th) ;
2 Commenti
Gauri Kant
il 16 Giu 2021
But this does not allow to move to the next iteration, does it?
Walter Roberson
il 16 Giu 2021
You can have the timer routine set a shared variable that is being tested by the loop to know to move on.
Categorie
Scopri di più su Loops and Conditional Statements in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!