JuliaIO/JLD2.jl

Option to load all variables from JLD2 file into global scope

Closed this issue · 2 comments

I do not see a way to load variables without specifying new variables names. The variable names are already in the file!

I am currently using this workaround, and think something like this should have a convenient function in the package.

julia> data = load(file)
Dict{String, Any} with 9 entries:
  "user_input"         => (spec_no = "SA-723", type_grade = "3", class_condition_temper = "2", KM620_coefficients_table_material_category = "Ferritic steel", num_plastic_points = 2
  "interpolants"       => (yield_interp = 15-element extrapolate(interpolate((::Vector{Int64},), ::Vector{Float64}, Gridded(Linear())), Line()) with element type Float64:
  "num_plastic_points" => 20
  "material_category"  => "Ferritic steel"
  "df"                 => 15×14 DataFrame
  "searchrange"        => (10.0, 1.0e6)
  "eq"                 => plasticity
  "temperatures"       => [100, 150, 200, 250, 300, 400, 500, 600, 650, 700, 750, 800, 850, 900, 950]

julia> for (key, value) in data
           Core.eval(Main, :($(Symbol(key)) = $value))
       end

I mostly use this package when I need to restart my REPL but don't want to lose progress on the variables I've generated so far.

You can simply load it by changing the variable to the appropriate format, such as my function to save the workspace, similar to jldsave("example.jld2"; z=x, x=y, y=3)

function save_workspace(outname="workspace.jld2")
	variable_names = Base.names(Main)
	workspace = Dict{Symbol, Any}()

	for var_name in variable_names
	     if (~isa((@eval Main.$(Symbol(var_name))),Function) && (~(@eval Main.$(Symbol(var_name)) in  [nothing,Main,Base,Core])) 
            && !isa((@eval Main.$(Symbol(var_name))), Module) && !isstructtype(@eval Main.$(Symbol(var_name))))
			try
				workspace[Symbol(var_name)] = eval(Meta.parse(string(var_name)))
			catch e
				println("Cannot save variable $var_name: $e")
			end
		end
		
	end
	
	varstring = join(
	["$k=$(typeof(workspace[k]) == String ? "\"$(workspace[k])\"" : workspace[k])" for k in keys(workspace)],
	","
	)
	
	savestring="JLD2.jldsave(\"$outname\","*varstring*")"
	@eval Main Meta.parse(savestring)
end

Use
Save workspace and load workspace

save_workspace()

@load "workspace.jld2"

I hope the developer will improve this workspace saving function into the project, many people have this demand

This functionality has existed for many years in @save filename (without further args) and @load "path/to/file".

However, not every object can be stored with JLD2 and there are conceptual problems. (only works interactively and not in module / no functions / no modules / no struct defs)
Due to this, there was a constant stream of complaints for years before this functionality was eventually removed from documentation.