Juliaでのデータの読み込み、皆様はどうされていますか?
今回は、HDF5フォーマットでの読み書きについて記します。便利です。
HDF5とは
Hierarchical Data Format 5
の略だそうです。高速に読み書きができるそうです。
では、Juliaで使ってみましょう。
JuliaでのHDF5.jlの良い点は、型について気にせずにデータの読み書きができることです。
テキストデータだといちいちstring型として読み込んでparseをしたりする必要がありますから、その部分を省けるのは便利です。
環境
- Julia 1.4.2
- Mac OS 10.14.6
- HDF5.jl 0.13.2
インストール
いつものように]を押してパッケージモードにして、
add HDF5
で入れます。
使い方
使い方を見てみましょう。
書き込み
まず書き込みです。適当なfunctionを作りました。
using HDF5
function test()
Lx = 12
Ly = 16
U = 3.0
r = rand(10)
cr = rand(3,3) .+ im+rand(3,3)
println("Lx = $Lx")
println("Ly = $Ly")
println("U = $U")
println("r = $r")
println("cr = $cr")
@time h5open("test.h5", "w") do file #ファイルtest.h5を開き、書き込み
write(file,"Lx",Lx)
write(file,"Ly",Ly)
write(file,"U",U)
write(file,"r",r)
write(file,"cr",cr)
end
end
test()
これを実行すると、test.h5というファイルが作られます。
HDF5の面白いところは、データに名前がついていることです。例えばwrite(file,"Lx",Lx) はLxという名前をつけました。
読み込む時には、自分の好きな名前のものを好きな順番で読み込むことができます。
読み込み
例えば、
function test2()
file = h5open("test.h5", "r")
U = read(file,"U")
cr = read(file,"cr")
Lx = read(file,"Lx")
Ly = read(file,"Ly")
r = read(file,"r")
close(file)
println("Lx = $Lx")
println("Ly = $Ly")
println("U = $U")
println("r = $r")
println("cr = $cr")
end
test2()
としてみました。
読み込む順番と書き込んだ順番が違うところに注目してください。このように、データの名前で読み込みができるので、順番を気にせずに良くなります。また、読み込みではfile = みたいな形で書きましたが、書き込みと同様にdo構文も使えます。普通のファイルの読み書きと同じですね。
実数、複素数、配列がちゃんと読み込まれていることを確認してみてください。
階層構造
次に、階層構造を扱ってみます。
function test()
Lx = 12
Ly = 16
U = 3.0
r = rand(10)
cr = rand(3,3) .+ im+rand(3,3)
println("Lx = $Lx")
println("Ly = $Ly")
println("U = $U")
println("r = $r")
println("cr = $cr")
@time h5open("test.h5", "w") do file
write(file,"Lx",Lx)
write(file,"Ly",Ly)
write(file,"U",U)
write(file,"r",r)
write(file,"cr",cr)
end
fp = h5open("test.h5", "cw")
for i=1:10
ra = rand()+im*rand()
write(fp,"/data/$i",ra)
println("$i $ra")
end
close(fp)
end
test()
としました。最初のコードに足しました。ここで、"cw"とするとファイルの追記モードになります。今度はopenしてcloseしてみました。write(fp,"/data/$i",ra)
とありますが、これが階層構造になっています。ループでiが動くので、/data/1から/data/10まで複素数の乱数が保存されたことになります。
読み込むには、
function test2()
file = h5open("test.h5", "r")
U = read(file,"U")
cr = read(file,"cr")
Lx = read(file,"Lx")
Ly = read(file,"Ly")
r = read(file,"r")
data4 = read(file,"/data/4")
close(file)
println("Lx = $Lx")
println("Ly = $Ly")
println("U = $U")
println("r = $r")
println("cr = $cr")
println("4 $data4")
end
とすればOKです。ここでは、/data/4だけを取ってきています。
このように、名前をつけてどんどん保存し、どんどん開けるので、大量のデータを処理することに向いています。