[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