我正在尝试使用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"
有没有人有任何想法?我完全不知所措。
由于
答案 0 :(得分:4)
我遇到了这个问题。我不确定原因,也不是hdf5维护者。 R包的作者没有回复。
有效的替代方案
自我最初回答以来,hdf5
包已归档,并且合适的备选方案(h5r
,rhdf5
和ncdf4 ) have been created; I am currently using
ncdf4`:
rhdf5
包。 变通办法我在找到上述替代方案之前使用的两个功能但不令人满意的变通办法:
ncdf4
库)。该问题的最小,可重复的演示:
这是一个可重现的示例,它发送错误
第一次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刷新缓冲区并完成文件。
希望这有帮助!