Другая техника, которую вы могли бы рассмотреть, это контрольные точки.Я использовал нечто подобное с длительными (более одного дня) циклами, работающими в среде, где машина может стать недоступной в любое время, например, распределенные кластеры запасных машин в лаборатории.
По сути, выпроверьте, существует ли файл «контрольной точки» перед началом цикла.Если это так, это означает, что цикл не завершился успешно в прошлый раз.Он содержит информацию о том, где был установлен цикл, а также о любом другом состоянии, которое вам нужно для возобновления работы.
Вот упрощенный пример:
function myFunction()
numIter = 10;
startIter = 1;
checkpointFilename = 'checkpoint.mat';
% Check for presence of checkpoint file suggesting the last run did not
% complete
if exist(checkpointFilename, 'file')
s = load(checkpointFilename);
startIter = s.i;
fprintf('Restarting from iteration %d\n', startIter);
end
for i = startIter:numIter
fprintf('Starting iteration %d\n', i);
expensiveComputation();
save(checkpointFilename, 'i');
end
% We succefully finished. Let's delete our checkpoint file
delete(checkpointFilename);
function expensiveComputation()
% Pretend to do lots of work!
pause(1);
end
end
Запуск и остановка с помощью ctrl-c часть пути выглядит так:
>> myFunction
Starting iteration 1
Starting iteration 2
Starting iteration 3
Starting iteration 4
Operation terminated by user during myFunction/expensiveComputation (line 27)
In myFunction (line 18)
expensiveComputation();
>> myFunction
Restarting from iteration 4
Starting iteration 4
Starting iteration 5
...