A lightweight way to save outputs from (expensive) computations.
The function form saves the output of running a function
and can be used with the do...end
syntax.
cache("test.bson") do
a = "a very time-consuming quantity to compute"
b = "a very long simulation to run"
return (; a = a, b = b)
end
The first time this runs,
it saves the output in a BSON file called test.bson
.
Subsequent runs load the saved output from the file test.bson
rather than re-running the potentially time-consuming computations!
Especially handy for long simulations.
An example of the output:
julia> using CacheVariables
julia> cache("test.bson") do
a = "a very time-consuming quantity to compute"
b = "a very long simulation to run"
return (; a = a, b = b)
end
[ Info: Saving to test.bson
(a = "a very time-consuming quantity to compute", b = "a very long simulation to run")
julia> cache("test.bson") do
a = "a very time-consuming quantity to compute"
b = "a very long simulation to run"
return (; a = a, b = b)
end
[ Info: Loading from test.bson
(a = "a very time-consuming quantity to compute", b = "a very long simulation to run")
The macro form looks at the code to determine what variables to save.
@cache "test.bson" begin
a = "a very time-consuming quantity to compute"
b = "a very long simulation to run"
100
end
The first time this block runs,
it identifies the variables a
and b
and saves them
(in addition to the final output 100
that is saved as ans
)
in a BSON file called test.bson
.
Subsequent runs load the saved values from the file test.bson
rather than re-running the potentially time-consuming computations!
Especially handy for long simulations.
An example of the output:
julia> using CacheVariables
julia> @cache "test.bson" begin
a = "a very time-consuming quantity to compute"
b = "a very long simulation to run"
100
end
┌ Info: Saving to test.bson
│ a
└ b
100
julia> @cache "test.bson" begin
a = "a very time-consuming quantity to compute"
b = "a very long simulation to run"
100
end
┌ Info: Loading from test.bson
│ a
└ b
100
An optional overwrite
flag (default is false) at the end
tells the macro to always save,
even when a file with the given name already exists.
julia> @cache "test.bson" begin
a = "a very time-consuming quantity to compute"
b = "a very long simulation to run"
100
end false
┌ Info: Loading from test.bson
│ a
└ b
100
julia> @cache "test.bson" begin
a = "a very time-consuming quantity to compute"
b = "a very long simulation to run"
100
end true
┌ Info: Overwriting test.bson
│ a
└ b
100
See also a similar package: Memoization.jl
Caveat:
The variable name ans
is used for storing the final output
(100
in the above examples),
so it is best to avoid using this as a variable name.