[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000113] reading binary files



北村です.

Ruby の本も発売されたところで nmd_array を試してみようと思い, 手始めに
データの入ったバイナリファイル(とはいっても単なる単精度の数値の固まり
でそれ以上の情報は全くない)を読み込んでそれをそのまま contour を引かせ
ようとしました.

このこと自体は何も考えずにできたのですが, 何も考えずに

volt = PMDArray.new("Barotropic Volticity","1/s",londim,latdim)
for i in 0..nlat-1
  for j in 0..nlon-1
    volt[j,i] = file_data.read(4).unpack('f')
  end
end

としたのが仇となって, データの読み込みにものすごく時間がかかってしまい
ます. 配列の大きさが 256*128 程度なら待てなくもないですが, 512*256 く
らいの大きさになると相当(歯磨きができるくらい)待たされたりします.

代わりに NArray の配列で,

tmp = NArray.new(nlon*nlat)
for i in 0..nlon*nlat-1
  tmp[i] = file_data.read(4).unpack('f')
end

とかやるとだいぶ速くなりますが, この時の tmp の中身は,

[1.0, 2.0, 3.0]

みたいのを期待していたのに,

[[1.0],[2.0],[3.0]]

となってしまうので, NMDArray のメソッド import1d をそのまま使うことが
できません. また, NMDArray の 1 次元配列への代入も 2 次元配列と同様に
時間がかかります. 

ということなので, この場合おそらく多次元配列への代入が律速段階になるの
だと思うのですが, 本当に上に書いたような代入の仕方が期待されているのか
が分からないのと, ファイルからの読み込み, 多次元配列への代入を C で実
装する場合に(最終的にはそうする必要があるとは思うのですが)どういった方
針で行なうのが妥当なのかがまだ見えていないので, ここで作業が止まってし
まいました. 

データの解析をするという試みは, 自分が実際に今行っていることのほとんど
が球面調和関数展開を経由するのでほとんどあきらめています.

あと, 本題からは離れますが, インタラクティブ Ruby(irb) を使うと, 電脳
ライブラリもインタラクティブに呼べるのは面白いと思いました. 描画に関係
するインタフェイスをうまく用意できれば, 適当なデータを図示してその結果
を見てから, 次に見たいものを判断して, それを図示するということがすぐに
できて便利な気がします. 個人的には, むしろそっちの方に興味がいっていま
す.

内容の薄いメールですみません.

----
 Keep It Simple, Stupid.
 Yuji Kitamura <kitamura@xxxxxx>
 Dept. Earth & Planetary Physics, Graduate School of Science, Univ. of Tokyo