保存在hdf5save中会创建一个不可读的文件

时间:2011-02-09 15:47:11

标签: r hdf5

我正在尝试使用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"

有没有人有任何想法?我完全不知所措。

由于

2 个答案:

答案 0 :(得分:4)

我遇到了这个问题。我不确定原因,也不是hdf5维护者。 R包的作者没有回复。

有效的替代方案

自我最初回答以来,hdf5包已归档,并且合适的备选方案(h5rrhdf5和ncdf4 ) have been created; I am currently using ncdf4`:

  1. 由于netCDF-4使用hdf5作为存储层,ncdf4包提供了netCDF-4和hdf5的接口。
  2. h5r包,其中R&gt; = 2.10
  3. BioConductor上提供rhdf5包。
  4. 变通办法我在找到上述替代方案之前使用的两个功能但不令人满意的变通办法:

    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代码)
    3. 该问题的最小,可重复的演示:

      这是一个可重现的示例,它发送错误

      第一次R会议

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

      第二次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
      

答案 1 :(得分:1)

我也遇到了同样的问题并找到了合理的解决方法。

这个问题似乎源于hdf5库最终确定文件的时间。如果它没有机会完成文件,则文件已损坏。我认为这是在刷新缓冲区但缓冲区并不总是刷新之后发生的。

我发现的一个解决方案是在单独的函数中执行hdf5save。将变量分配到globalenv(),然后调用hdf5save并退出函数。当函数完成时,内存似乎被清理,这使得hdf5 libarary刷新缓冲区并完成文件。

希望这有帮助!