在 hdf5save 中保存会创建一个不可读的文件
Posted
技术标签:
【中文标题】在 hdf5save 中保存会创建一个不可读的文件【英文标题】:Saving in hdf5save creates an unreadable file 【发布时间】:2011-06-24 05:51:19 【问题描述】:我正在尝试使用 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"
有人有什么想法吗?我完全不知所措。
谢谢
【问题讨论】:
【参考方案1】:我遇到过这个问题。我不确定原因,hdf5 维护者也不确定。 R包的作者没有回复。
可行的替代方案
自从我最初回答以来,hdf5
包已经存档,以及合适的替代品(h5r
、rhdf5
和 ncdf4) have been created; I am currently using
ncdf4`:
-
由于 netCDF-4 使用 hdf5 作为存储层,ncdf4 包提供了 netCDF-4 和 hdf5 的接口。
h5r 包 R>=2.10
rhdf5
包可在 BioConductor 上获得。
解决方法在找到上述替代方法之前,我使用了两个功能但不令人满意的解决方法:
-
安装 R 2.7、hdf5 版本 1.6.6、R hdf5 v1.6.7 和 zlib1g 版本 1:1.2.3.3 并在编写文件时使用它(这是我在迁移到
ncdf4
库之前的解决方案)。李>
在 [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
【讨论】:
感谢您的解决方案,我认为您的第二个选项最适合我。我找不到 hdf5tools 程序,但我确实找到了 h5utils,其中包含一个名为 h5fromtxt 的程序,它似乎可以满足我的要求。 @Matt 我已经更新了我的答案,我的意思是说 h5utils,一组非常好的工具。我发现h5totxt test.h5
处理了h5load('test.h5')
没有处理的文件(所以文字只是R 无法读取,不一定损坏)。
看来hdf5save
命令只是偶尔起作用,而且似乎没有押韵或理由。至少(感谢您)我们现在有一个可重现的代码示例,我/我们可以将它带到他们的错误跟踪器(或尝试修复它,我假设它是开源的)。我现在还在工作,但我回家后会做的。干杯,
我相信这与 on.exit 在 R 2.8 之后的变化有关。 hdf5cleanup() 函数因此不再被调用,这可能会使文件处于错误状态。
@frank 有简单的解决方法吗? h5totxt 仍然有效吗?【参考方案2】:
我也遇到了同样的问题并找到了合理的解决方法。
问题似乎源于 hdf5 库完成文件的时间。如果它没有机会完成文件,则文件已损坏。我认为这发生在缓冲区被刷新但缓冲区并不总是刷新之后。
我发现的一个解决方案是在单独的函数中执行 hdf5save。将变量赋值给 globalenv(),然后调用 hdf5save 并退出函数。当函数完成时,内存似乎被清理了,这使得 hdf5 库刷新缓冲区并最终确定文件。
希望这会有所帮助!
【讨论】:
以上是关于在 hdf5save 中保存会创建一个不可读的文件的主要内容,如果未能解决你的问题,请参考以下文章
试图从一个 np 数组中创建一个可读的 txt 文件,全部打印在一行上?
打开 openpyxl 保存的工作簿时 Excel 有不可读的内容