保存一个复合类型的数组 Julia
Saving a array of composite type Julia
对于我正在 运行 进行的实验,定义自己的类型对我来说很方便。问题是计算量非常大,所以我需要在服务器上 运行 它,然后访问数据以绘制结果。
所以第一种类型有我定义的某些字段,然后其他类型没有固定数量的字段。基本上我有这种交织在一起的类型:
type TestType1
value::Int
end
type TestType2
testvec::Any
TestType2()=new(Test2[])
end
type TestType3
testtype2::Any
TestType3()=new(TestType2[])
end
type TestType4
testtype3::Any
TestType4()=new(TestType3[])
end
因为 TestType1 永远不会改变,但在 TestType2 中我想存储不同数量的 testtype1 值等...
所以链的创建是这样的:
test1=Test2(2);
test2=TestType2();
test3=TestType3();
test4=TestType4();
push!(test2.testvec,test1)
push!(test3.testtype2,test2)
push!(test4.testtype3,test3)
这很好用,我可以轻松访问我在实验中需要的一切。
虽然问题是因为我 运行 它在服务器上,但我需要能够在 运行 的末尾存储 test4
然后在另一个服务器上再次打开它服务器使用数据并绘制漂亮的图。
我尝试使用 JLD,但我认为它是用于词典的,它不允许我检索信息。
我希望能够调用存储在某处的 test4 文件中的所有字段,而无需更改服务器。
我对 Julia 和 OOP 还很陌生,一般来说我不知道如何做我想做的事。
有人可以帮忙吗?
谢谢!
JLD.load
returns 一个字典,里面就是你的对象。例如:
# test_types.jl
__precompile__()
module TestTypes
using JLD: save
import Base: push!
export TestType1, TestType2, TestType3, TestType4
struct TestType1
value::Int
end
struct TestType2
data::Vector{TestType1}
TestType2() = new(TestType1[])
end
struct TestType3
data::Vector{TestType2}
TestType3() = new(TestType2[])
end
struct TestType4
data::Vector{TestType3}
TestType4() = new(TestType3[])
end
for n in 2:4
@eval function Base.push!(test_type::$(Symbol(:TestType, n)), test_arg::$(Symbol(:TestType, n-1)))
push!(test_type.data, test_arg)
end
end
function main()
test1 = TestType1(2)
test2 = TestType2()
test3 = TestType3()
test4 = TestType4()
push!(test2, test1)
push!(test3, test2)
push!(test4, test3)
file = "test_resutls.jld"
save(file, "test4", test4)
info("Test results saved in: $file")
return @show test4
end
end
交互看起来像这样:
julia> include("test_types.jl")
Main.TestTypes
julia> using Main.TestTypes: main
julia> original_test4 = main();
INFO: Test results saved in: test_resutls.jld
test4 = Main.TestTypes.TestType4(Main.TestTypes.TestType3[Main.TestTypes.TestType3(Main.TestTypes.TestType2[Main.TestTypes.TestType2(
Main.TestTypes.TestType1[Main.TestTypes.TestType1(2)])])])
julia> using JLD: load
julia> results = load("test_resutls.jld")
Dict{String,Any} with 1 entry:
"test4" => Main.TestTypes.TestType4(Main.TestTypes.TestType3[Main.TestTypes.TestType3(Main.TestTypes.TestType2[Main.TestTypes.Test…
julia> copy_test4 = results["test4"] # your data is inside this dict!
Main.TestTypes.TestType4(Main.TestTypes.TestType3[Main.TestTypes.TestType3(Main.TestTypes.TestType2[Main.TestTypes.TestType2(Main.Tes
tTypes.TestType1[Main.TestTypes.TestType1(2)])])])
julia> original_test4.data[1].data[1].data[1].value == copy_test4.data[1].data[1].data[1].value
true
对于我正在 运行 进行的实验,定义自己的类型对我来说很方便。问题是计算量非常大,所以我需要在服务器上 运行 它,然后访问数据以绘制结果。
所以第一种类型有我定义的某些字段,然后其他类型没有固定数量的字段。基本上我有这种交织在一起的类型:
type TestType1
value::Int
end
type TestType2
testvec::Any
TestType2()=new(Test2[])
end
type TestType3
testtype2::Any
TestType3()=new(TestType2[])
end
type TestType4
testtype3::Any
TestType4()=new(TestType3[])
end
因为 TestType1 永远不会改变,但在 TestType2 中我想存储不同数量的 testtype1 值等...
所以链的创建是这样的:
test1=Test2(2);
test2=TestType2();
test3=TestType3();
test4=TestType4();
push!(test2.testvec,test1)
push!(test3.testtype2,test2)
push!(test4.testtype3,test3)
这很好用,我可以轻松访问我在实验中需要的一切。
虽然问题是因为我 运行 它在服务器上,但我需要能够在 运行 的末尾存储 test4
然后在另一个服务器上再次打开它服务器使用数据并绘制漂亮的图。
我尝试使用 JLD,但我认为它是用于词典的,它不允许我检索信息。
我希望能够调用存储在某处的 test4 文件中的所有字段,而无需更改服务器。
我对 Julia 和 OOP 还很陌生,一般来说我不知道如何做我想做的事。
有人可以帮忙吗?
谢谢!
JLD.load
returns 一个字典,里面就是你的对象。例如:
# test_types.jl
__precompile__()
module TestTypes
using JLD: save
import Base: push!
export TestType1, TestType2, TestType3, TestType4
struct TestType1
value::Int
end
struct TestType2
data::Vector{TestType1}
TestType2() = new(TestType1[])
end
struct TestType3
data::Vector{TestType2}
TestType3() = new(TestType2[])
end
struct TestType4
data::Vector{TestType3}
TestType4() = new(TestType3[])
end
for n in 2:4
@eval function Base.push!(test_type::$(Symbol(:TestType, n)), test_arg::$(Symbol(:TestType, n-1)))
push!(test_type.data, test_arg)
end
end
function main()
test1 = TestType1(2)
test2 = TestType2()
test3 = TestType3()
test4 = TestType4()
push!(test2, test1)
push!(test3, test2)
push!(test4, test3)
file = "test_resutls.jld"
save(file, "test4", test4)
info("Test results saved in: $file")
return @show test4
end
end
交互看起来像这样:
julia> include("test_types.jl")
Main.TestTypes
julia> using Main.TestTypes: main
julia> original_test4 = main();
INFO: Test results saved in: test_resutls.jld
test4 = Main.TestTypes.TestType4(Main.TestTypes.TestType3[Main.TestTypes.TestType3(Main.TestTypes.TestType2[Main.TestTypes.TestType2(
Main.TestTypes.TestType1[Main.TestTypes.TestType1(2)])])])
julia> using JLD: load
julia> results = load("test_resutls.jld")
Dict{String,Any} with 1 entry:
"test4" => Main.TestTypes.TestType4(Main.TestTypes.TestType3[Main.TestTypes.TestType3(Main.TestTypes.TestType2[Main.TestTypes.Test…
julia> copy_test4 = results["test4"] # your data is inside this dict!
Main.TestTypes.TestType4(Main.TestTypes.TestType3[Main.TestTypes.TestType3(Main.TestTypes.TestType2[Main.TestTypes.TestType2(Main.Tes
tTypes.TestType1[Main.TestTypes.TestType1(2)])])])
julia> original_test4.data[1].data[1].data[1].value == copy_test4.data[1].data[1].data[1].value
true