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

[dennou-ruby:002494] Re: [gphys_netcdf] too many connects



堀之内です。

> とりあえず, 必要なくなったら close するように
> 
>   ncfile=gphys.data.file
>   ncfile.close if ncfile.class.to_s == "NumRu::NetCDF"
> 
> なんてので対処してますが, こんなもんでいいんすかね. 
> 
> gphys レベルからの close メソッドがないのが問題なのかなぁ, 
> というのが今回の問題にぶつかった際の素人の感想です. 

この問題へのお勧めの対処法は、GPhysオブエジェクトを作る前に
ファイルを開いておいて、要らなくなったらそれを消す、です。
例えばこんな感じ:

   ncifile = NetCDF.open('hoge.nc')
   gphys = GPhys::IO.open(ncfile, 'hogevar')
   ..必要なことをする..
   ncfile.close   # gphysが要らなくなったら。

GPhys::IO.open の第一引数はファイルポインターオブジェクトを取れます。
文字列を与えた場合はそれをパスとしてファイルの種類を判断して
内部で勝手に開くことになってますが。

さて、竹広さんご指摘のように、与えられたGPhysオブジェクトに対し、
ファイルを閉じるやり方は陽には用意してません。これは、私の
考えでは、ある程度しょうがないのです。GPhysオブジェクトは主変数や
座標変数を収める VArray オブジェクトを束ねて構成されます。これらは
ファイル上の変数とは限らない(NArrayを使ってメモリー上にある場合)
だけでなく、異なるファイル状のものが寄せ集めにもできます。つまり、
対応するファイルはないかもしれないし、複数かもしれない。
ところが、GPhys::IO.open を使って GPhys オブジェクトを構成した
場合は、自動的にファイルは一つです。なので、上で私が書いた
ようにするほうがたぶん見通しが良くて、竹広さんの試みの方は、
裏技といっていいと思います。ちなみに GPhys オブジェクトを作るのに
GPhys::IO.open を使う必要は全くなく、VArrayを元に一から自分で
組み立てられます。

さて、ここまで書いて気づいたのですが、竹広さんは GPhys::IO.open_gturl 
派ですね(私はあまりつかわない)。この場合、NetCDF ファイルを開いて与
えることは出来ないので、「裏技」しかないなぁ。ごめんなさい。

# ところで、竹広さんが素人ということになると、敷居が高くなってしまい
   ます。皆様、これは「素人」質問ではないです。気にせず質問してください。
   (今回話題になったような、ファイルにまつわるあれこれは、チュートリア
   ルに書いてあるべきですね。あと、発端になった問題については、あまり
   気にしないですむようにDODS版NetCDFがなってるべき。)