[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