줄리아에서 .mat처럼 데이터를 저장하는 법
개요
JLD.jl
는 줄리아를 사용하면서 생기는 임시 데이터들을 저장할 수 있도록 해주는 패키지다1. 퓨어 줄리아 프로젝트를 하면서 데이터의 입출력이 번거롭다면 유용하게 쓸 수 있다. 한편 JLD.jl
의 인터페이스를 더욱 직관적으로 개선시킨 JLD2.jl
도 사용할 수 있다2. 본 포스트에 소개된 내용은 대충 이런 기능이 있구나 정도로만 받아들이고 가능하면 JLD2.jl
를 사용하도록 하자. 하위호환도
문제없이 지원한다.
한편 mat 파일 비슷한 게 아니라 정확히 매트랩의 mat 파일을 읽고 쓰고 싶다면 MAT.jl
패키지를 참고하면 된다.
코드
using JLD
cd(@__DIR__); pwd()
numpad = reshape(1:9, 3,3)
cube = zeros(Int64, 3,3,3)
save("mydata.jld", "numpad",numpad, "cube",cube)
mydata = load("mydata.jld")
mydata["numpad"]
mydata["cube"]
실행결과
julia> numpad = reshape(1:9, 3,3)
3×3 reshape(::UnitRange{Int64}, 3, 3) with eltype Int64:
1 4 7
2 5 8
3 6 9
julia> cube = zeros(Int64, 3,3,3)
3×3×3 Array{Int64, 3}:
[:, :, 1] =
0 0 0
0 0 0
0 0 0
[:, :, 2] =
0 0 0
0 0 0
0 0 0
[:, :, 3] =
0 0 0
0 0 0
0 0 0
julia> save("mydata.jld", "numpad",numpad, "cube",cube)
┌ Warning: JLD incorrectly extends FileIO functions (see FileIO documentation)
└ @ FileIO C:\Users\rmsms\.julia\packages\FileIO\5JdlO\src\loadsave.jl:215
저장되는 파일의 확장자는 *.jld
여야한다. 저장되는 각 데이터의 이름을 문자열로 주고 할당된 변수를 연달아 이어 적으면 그 데이터들이 하나로 묶여서 저장된다.
julia> mydata = load("mydata.jld")
┌ Warning: JLD incorrectly extends FileIO functions (see FileIO documentation)
└ @ FileIO C:\Users\rmsms\.julia\packages\FileIO\5JdlO\src\loadsave.jl:215
Dict{String, Any} with 7 entries:
"_creator\\JULIA_PATCH" => 0x00000001
"cube" => [0 0 0; 0 0 0; 0 0 0]…
"_creator\\WORD_SIZE" => 64
"numpad" => [1 4 7; 2 5 8; 3 6 9]
"_creator\\JULIA_MINOR" => 0x00000006
"_creator\\ENDIAN_BOM" => 0x04030201
"_creator\\JULIA_MAJOR" => 0x00000001
불러온 결과는 보다시피 딕셔너리를 반환했다. 저장할 때 문자열로 주었던 이름들이 키key로 들어가고 실제 데이터는 밸류value에 있다. 다음과 같이 딕셔너리로써 참조하면 된다.
julia> mydata["numpad"]
3×3 reshape(::UnitRange{Int64}, 3, 3) with eltype Int64:
1 4 7
2 5 8
3 6 9
julia> mydata["cube"]
3×3×3 Array{Int64, 3}:
[:, :, 1] =
0 0 0
0 0 0
0 0 0
[:, :, 2] =
0 0 0
0 0 0
0 0 0
[:, :, 3] =
0 0 0
0 0 0
0 0 0
JLD2
예제에서 굳이 스트링으로 딕셔너리를 만드는 과정이 불편했는데, JLD2.jl
에서는 네임드튜플로 한결 편하게 같은 기능을 사용할 수 있다.