データの抽出時間をいかに短くするか
Illustris-TNGのファイルの合計容量は \(z=0\) のメインのSnapshotにおいて、2.7 TBあり、銀河や銀河団を分類するデータGroupcatでさえ5.9 GBもある。
それぞれの粒子はHDF5 ( Hierarchical Data Format – Wikipedia) に格納され、粒子の種類に応じて物理量が格納されている。

これらの物理量を用いて抽出・解析を行う。つまり2段階のプロセスが存在するのである。1段階目のプロセスと2段階目のプロセスを分けることで効率化、高速化を実現を行う。
抽出 (extracting)
Version 1
まずとりあえず、今回必要なデータは
- Coordinates (Dims=(N,3))
- Velocities (Dims=(N,3))
- Masses (Dims=N)
のみを取り出す。
flowchart LR
a0[snap_099.0<b>.hdf5</b>]--Convert-->b0[CMVonly_099.0<b>.npz</b>]
a1[snap_099.1<b>.hdf5</b>]--Convert-->b1[CMVonly_099.1<b>.npz</b>]
a*[snap_099.*<b>.hdf5</b>]--Convert-->b*[CMVonly_099.*<b>.npz</b>]
c[CMVonly<b>.npz</b>]
d{{Using}}
b0--Extract-->c
b1--Extract-->c
b*--Extract-->c
c-->d
HDF5から抽出したら直ちにNPZファイルにして保存し、メモリを開放することで使用メモリを最小限にしている。
ただし最終的に保存したNPZファイルすべてを参照するため、メモリを爆食いしているわけでないかもしれない。
Version 2
ChunkファイルごとにHDF5からNPZファイルに変換を行い、特定のSubhaloにカットを行う作業をしてきたが、これを一括でJuliaで行い、さらに並列計算を行った。
いままではPython(変換)+Julia(抽出)で時間が1時間超ほどだった。
flowchart LR
a0[snap_099.0<b>.hdf5</b>]
a1[snap_099.1<b>.hdf5</b>]
a*[snap_099.*<b>.hdf5</b>]
c[CMVonly<b>.npz</b>]
d{{Using}}
a0--Convert/Extract-->c
a1--Convert/Extract-->c
a*--Convert/Extract-->c
c-->d

version 3
flowchart LR
a0[snap_099.0<b>.hdf5</b>]
a1[snap_099.1<b>.hdf5</b>]
a*[snap_099.*<b>.hdf5</b>]
c[AllData<b>.npz</b>]
d{{Using}}
a0--Convert-->c
a1--Convert-->c
a*--Convert-->c
c--Extract--> d
さらにConvert部分の高速化を測るために次のようにプログラムを改良した。
flowchart TD
t1{{"@threads"}}
t2{{"@threads"}}
t*{{"@threads"}}
i1["i=1"]
i3["i=*"]
a1[get Coordinates]
a3[get Coordinates]
b1[get Velocities]
b3[get Velocities]
c1[get GFM_Metals]
c3[get GFM_Metals]
D["DATA"]
t1-->i1
t1-->i3
subgraph for
i1-->t2
i3-->t*
subgraph "get_data(1)"
t2-->a1
t2-->b1
t2-->c1
end
subgraph "get_data(*)"
t*-->a3
t*-->b3
t*-->c3
end
end
a1-->D
a3-->D
b1-->D
b3-->D
c1-->D
c3-->D
メモリ不足で強制終了。
version 4
flowchart LR
a0[snap_099.0<b>.hdf5</b>]
a1[snap_099.1<b>.hdf5</b>]
a*[snap_099.*<b>.hdf5</b>]
c[Mapping File]
d{{Using}}
subgraph Preparation
a0--Random Extract-->c
a1--Random Extract-->c
a*--Random Extract-->c
end
a0--Extract-->d
a1--Extract-->d
a*--Extract-->d
c--> d
Preparation-->c