logo

줄리아에서 .mat처럼 데이터를 저장하는 법 📂줄리아

줄리아에서 .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에서는 네임드튜플로 한결 편하게 같은 기능을 사용할 수 있다.