在 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 包已经存档,以及合适的替代品(h5rrhdf5 和 ncdf4) have been created; I am currently usingncdf4`:

    由于 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 文件,全部打印在一行上?

Swift 3 或 4 保存到自定义相册会创建重复的图像

Sed 在 Windows 中创建不可删除的文件

打开 openpyxl 保存的工作簿时 Excel 有不可读的内容

使用 mongoose 保存子文档数组会创建空数组 MEAN 堆栈

在 PHP 可读的 javascript 中创建 PEM 密钥对