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. rhdf5软件包可在 BioConductor 上获得。

解决方法 在找到上述替代方法之前,我使用了两个功能但不令人满意的解决方法:

  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

第二次 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 库完成文件的时间。如果它没有机会完成文件,则文件已损坏。我认为这发生在缓冲区被刷新但缓冲区并不总是刷新之后。

我发现的一种解决方案是在单独的函数中执行 hdf5save 。将变量赋值给 globalenv(),然后调用 hdf5save 并退出函数。当函数完成时,内存似乎被清理了,这使得 hdf5 库刷新缓冲区并最终确定文件。

希望这可以帮助!

于 2012-03-13T19:16:57.457 回答