Hi,
Imagine you have a big script running, which takes a very long while to execute.
Then, you need the machine to go down.
You hit CTRL+C, which interrupts the script, and you note the line on which your script was interrupted.
You type "save", which saves everything
the machine reboots, you launch matlab, and "load" back your stuff
the question is : is there a way to start the script from the line it was interrupted ?? (which may be INSIDE a for loop!) Since you have all the variables up and at correct values, it should be possible, but I don't see how to do it...
can someone help me ?
thanks
antoine
No, MATLAB does not have any method of "checkpointing" program state and restarting it later. You would need to write in the functionality yourself.
Sometimes the easiest way to achieve checkpointing is to write in "transaction processing" style with a State Machine. Instead of having series of loops and routines that call routines that call routines, etc., you flatten out the structure. You have a variable that contains information about the current major and minor "state" (what is being done now), and the routine branches on the major state to blocks of code that know about minor states, and so on, eventually getting to a code location where the current state is fully decoded, at which point the code calls a routine that does just enough work to change state, with the new state being returned upward. And then you go through the next iteration, the state is decoded all over again, and so on. When enough work has been done to be "worthwhile", perhaps when the code figures out that it is at the end of a substate, the code writes out all the information about the current state and current variables.
With this structure, continuing becomes easy: just restore the last saved state with variables, and feed that into the state machine. The state machine won't even notice that there was a downtime in-between (but you might have to re-open files you were working with.)
There are some kinds of problems where a State Machine works out very naturally, compact and efficient and flexible. It is, however, not a programming structure that most people are comfortable with.
At various points (places that take a long time to execute) you could add tests that determine if you need to execute that portion of the code. For example, you could set flags or test for created variables. For loops, you could test the loop variable to see if it exists and if it does to initialize it with the previous value. If you have more than one loop, make sure you use unique variables to identify each loop correctly. You should clear all variables before loading the old data file.
Thanks for answering.
Still, the script is already running, I cannot modify it.
There is no way in matlab to run a script from an arbitrary line number ?
???? the script is already running, I cannot modify it. ????
Modify the script when it has stopped running. To start a script from an arbitrary line number, you could delete the code above that line number. But that won't help you in a loop. If you run the code often, best to use tests in the script. Another way to do this without modifying code is to select the code you want to run and press F9. But again, you will have problems if it is in the middle of a loop.
OK, so basically it's not possible..
I think it's a pity
thanks for your answers anyways
It is one of those issues that turns out to be substantially more difficult than is obvious, and gets more difficult and complicated still as you increase the software and hardware optimization.
For example, consider a simple sequence such as
A = rand(); %or any non-constant value A = A + 1.5; A = A * 17.2;
The straight-forward interpretation is
Calculate a value into floating point register #1 (FP1) Store FP1 into the memory location for A Load from the memory location for A and store in FP1. Add 1.5 to FP1 storing into FP1 Store FP1 into the memory location for A Load from the memory location for A and store in FP1 Multiply FP1 by 17.2 storing into FP1 Store FP1 into the memory location for A
With this structure if you know how far you got and you have the current memory location for A, you only have to "back up" at most one instruction (re-load FP1 from A) to continue on.
But the above is inefficient. Must more efficient would be
Calculate a value into floating point register #1 (FP1) Add 1.5 to FP1 storing into FP1 Multiply FP1 by 17.2 storing into FP1 Store FP1 into the memory location for A
But if you do this kind of optimization, you have to keep careful track of where you got to. As the calculations get more complex, involving more variables, you will often run into situations where you end up storing some of the variables into memory locations but keeping other variables in the floating point registers for efficiency, and you will end up doing so in patterns that make it impossible to restart by backing up, unless the code took the care to remember the "original" values of each affected memory location.
Now go multi-cored, hyper-threaded, GPU, add in I/O calls that should not be duplicated ("Deduct $10000 from bank account. Now do it again because I'm not sure whether it went through before or not.")
0 Comments