2012-10-02 8 views
5

私はLinuxマシンにhdf5パッケージを正常にインストールしました。私は今、ループ内の多数のhdf5ファイルからデータを読み込み、時系列を作成したいと考えています。各hdf5ファイルは異なる時刻に対応しています。多くのファイルを読み込んだら(1000以上)、Rはあまりにも多くのファイルが開いていると言う。私はループを続けることができるようにそれらを閉じる方法を見つけたいと思います。ここでは、コードは次のとおりです。Rでロードした後、hdf5ファイルを閉じるにはどうすればよいですか?

fdate <- "200605312355" # the first date for my test loop 
    fmax <- 1400 
    arr <- vector() 

    for (i in 1:fmax){ 
     fname <- paste(fdate,"_.h5") # path of h5 file 
     fid <- hdf5load(fname) # fid = NULL 
     arr[i] <- somevariable$data_array[lon,lat] 
     # would like to close the file here 
     fdate <- newdate(fdate,60*5) # a function that increments the date by seconds. 
    } 

HDF5パッケージには、それが物事をクリーンアップする可能性があるように見えますが、それはファイル識別子を必要とする関数のhdf5cleanupが含まれています。上記のコード内のfidはNULLを返します。代わりにhdf5cleanup(fname)というファイル名を挿入しようとすると、Rは中止されます。おそらく、hdf5loadがファイルを閉じて失敗するはずです。その場合、system()コマンドなどを発行して接続を閉じる方法はありますか?

ちなみに、showConnections()は何も返しません。文字通り、 "descriptionクラスmode text isopen can read"というヘッダ名だけが返されます。

私の質問は短く: hdf5load()をロードした後、R内のhdf5ファイルへの接続を閉じるにはどうすればよいですか?

+0

私は 'R'を中断していますので、' hdf5'パッケージのメンテナーに連絡してください。メンテナーは、ファイルを閉じるための正しい呼び出しをあなたに伝えることもできます。 –

答えて

2

注:コメントによれば、次の回答は機能しません。少なくとも今のところは、成功していないルートを追求することを残すこと。


私はhdf5がインストールされていないので、これが動作するか私がチェックすることはできませんので、これは暗闇の中でショットのビットです:

fname <- paste(fdate,"_.h5") # path of h5 file 
# fhandle <- open(fname) # Comment pointed out this was not the intended function 
fhandle <- file(description = fname, open = "rb") 
hdf5load(fhandle) # hdf5load returns nothing when load=TRUE (the default) 
arr[i] <- somevariable$data_array[lon,lat] 
close(fhandle) 

ドキュメントはhdf5loadがかかることを言いますファイル名ですが、ファイルハンドルをとることもあります。もしそうなら、これはうまくいくかもしれません。

+0

迅速なお返事ありがとうございます! open()関数は 'connection'クラス用ですので、ここでは動作しません。 – user1714900

+0

私はファイルを開いてクローズ(fhandle)で閉じることができますが、残念ながら 'hdf5load(fhandle)'はエラーを返します 'fhandle < - file(description = fname、open =" rb "最初の引数はパス名でなければなりません。詳細については、hdf5load関数は次のとおりです。 'function(file、load = TRUE、冗長度= 0、tidy = FALSE) { call < - sys.call() .External(" do_hdf5load "、call、sys)ロード、as.integer(冗長)、as.logical(tidy)、PACKAGE = "hdf5") } 'フレーム(sys.parent())、 – user1714900

関連する問題