23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Juliaでのデータの保存と読み込み:HDF5を使ってみる

Last updated at Posted at 2020-07-28

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だけを取ってきています。
このように、名前をつけてどんどん保存し、どんどん開けるので、大量のデータを処理することに向いています。

23
19
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?