2

Rを使用して配列をHDF5ファイルとして保存しようとしていますが、うまくいきません。

私が実行した問題を試して診断するためにexample(hdf5save). これで、簡単に読める HDF5 ファイルが正常に作成されましたh5dump

その後、R コードを手動で実行したところ、機能しないことがわかりました。私が実行したコードは、サンプル スクリプトで実行したものとまったく同じでした (上書きを避けるためにファイル名を変更したことを除いて)。コードは次のとおりです。

(m <- cbind(A = 1, diag(4)))
ll <- list(a=1:10, b=letters[1:8]);
l2 <- list(C="c", l=ll); PP <- pi
hdf5save("ex2.hdf", "m","PP","ll","l2")
rm(m,PP,ll,l2)  # and reload them:
hdf5load("ex2.hdf",verbosity=3)
m        # read from "ex1.hdf"; buglet: dimnames dropped
str(ll)
str(l2)

からのエラーメッセージは次のh5dumpとおりです。

h5dump error: unable to open file "ex2.hdf"

誰にもアイデアはありますか?私は完全に途方に暮れています。

ありがとう

4

2 に答える 2

4

私はこの問題を抱えています。原因はわかりませんし、hdf5 メンテナーもそうではありません。R パッケージの作成者は返信していません。

機能する代替手段

私が最初に回答して以来、hdf5パッケージはアーカイブされ、適切な代替手段 ( h5rrhdf5、および ncdf4 ) have been created; I am currently usingncdf4`:

  1. netCDF-4 は hdf5 をストレージ層として使用するため、ncdf4パッケージは netCDF-4 と hdf5 の両方へのインターフェースを提供します。
  2. R>=2.10のh5rパッケージ
  3. パッケージはrhdf5BioConductor で入手できます。

上記の代替案を見つける前に使用した、機能的ではあるが不十分な 2 つの回避策:

  1. R 2.7、hdf5 バージョン 1.6.6、R hdf5 v1.6.7、および zlib1g バージョン 1:1.2.3.3 をインストールし、ファイルを書き込むときにこれを使用します (これは、ncdf4ライブラリに移行するまでの私の解決策でした)。
  2. [hdf5utils][1] プログラムのコマンド ラインで h5totxt を使用します (bash を使用し、R コードを書き直す必要があります)。

問題の最小限の再現可能なデモンストレーション:

エラーを送信する再現可能な例を次に示します

最初の R セッション

library(hdf5)
dat <- 1:10
hdf5save("test.h5","dat")
q()
n # do not save workspace

2 番目の R セッション:

library(hdf5)
hdf5load("test.h5")

出力:

HDF5-DIAG: Error detected in HDF5 library version: 1.6.10 thread
47794540500448.  Back trace follows.
 #000: H5F.c line 2072 in H5Fopen(): unable to open file
   major(04): File interface
   minor(17): Unable to open file
 #001: H5F.c line 1852 in H5F_open(): unable to read superblock
   major(04): File interface
   minor(24): Read failed
 #002: H5Fsuper.c line 114 in H5F_read_superblock(): unable to find file
signature
   major(04): File interface
   minor(19): Not an HDF5 file
 #003: H5F.c line 1304 in H5F_locate_signature(): unable to find a valid
file signature
   major(05): Low-level I/O layer
   minor(29): Unable to initialize object
Error in hdf5load("test.h5") : unable to open HDF file: test.h5
于 2011-02-10T07:11:10.993 に答える
1

私も同じ問題に遭遇し、合理的な修正を見つけました。

この問題は、hdf5 ライブラリがファイルをファイナライズするときに発生するようです。ファイルをファイナライズする機会が得られない場合、ファイルは破損しています。これはバッファがフラッシュされた後に発生すると思いますが、バッファは常にフラッシュするとは限りません。

私が見つけた 1 つの解決策は、別の関数で hdf5save を実行することです。変数を globalenv() に割り当て、hdf5save を呼び出して関数を終了します。関数が完了すると、メモリがクリーンアップされたように見え、hdf5 ライブラリがバッファをフラッシュしてファイルをファイナライズします。

お役に立てれば!

于 2012-03-13T19:16:57.457 に答える