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

[dennou-ruby:000118] Re: reading binary files



北村です.

早速のお返事, どうもありがとうございます.

| これを回避するには
| 
|     tmp[i] = file_data.read(4).unpack('f')[0]
| 
| とすれば良いでしょう。

これはあたりでした. この場合,

file_data.read(4).unpack('f').type     =>  Array
file_data.read(4).unpack('f')[0].type  =>  Float

になっていました. リファレンスにもちゃんと書いてありました. NArray で
読み込むことで, かなり速くなりました.

| NArray は ruby の Array をそのまま継承しつつ、数学演算の装備と再定義を
| 行ったものですが、代入部分はいじってないので Array と同じはずです。従っ
| て、このようになってしまう理由は、右辺の戻り値がスカラーでなく長さ1の
| 配列だからでしょう。NMDArrayのほうも恐らく内部のデータ領域には 
| [[1.0],[2.0],[3.0]] が入ってるだろうと思います(p voltすればわかります)。

NMDArray の方は, [1.0, 2.0, 3.0] になります. これは, NMDArray.rb で

 def []=(*idx)
	.....
    if rhs.is_a?(Array) then
      if idxar.length < rhs.length then
        raise(RuntimeError,"the array at rhs is too short")
      end
      for i in 0..idxar.length-1; @xxxxxx[idxar[i]]=rhs[i]; end
    elsif rhs.is_a?(Numeric) 
      for i in 0..idxar.length-1; @xxxxxx[idxar[i]]=rhs; end
    else
      raise(RuntimeError,"invalid type: "+rhs.type.to_s)
    end

となっているからだろうと思います.

| なお、unpack('f') が配列を返すということは、実は複数個の浮動小数点をいっ
| ぺんに処理できるのではないですか。それならより速くなるはずです。

これも全くその通りで, 今の場合ならループを回さずとも

tmp = file_data.read(4*nlon*nlat).unpack('f*')
volt[0..-1] = tmp

とすれば目的は達成できます. 

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