コンテンツにスキップ

データの抽出時間をいかに短くするか

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

コード

GDU2YPSWoAIqoNN

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