首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用rhdf5编写数据的空字符串

用rhdf5编写数据的空字符串
EN

Stack Overflow用户
提问于 2019-12-01 07:34:09
回答 2查看 94关注 0票数 0

我很难使用低级别API (特别是函数)使用hdf5文件中的rhdf5将字符串写入组。

  • H5Fcreate
  • H5Gcreate
  • H5Screate
  • H5Dcreate
  • H5Dwrite

这是我的数据:

代码语言:javascript
复制
# strings
v <- c("val1", "val2", "cat", "dog")

我希望这个向量v存在于一个名为“元数据”的hdf5组中。在这里,我尝试将这个一维char数组写入文件:

代码语言:javascript
复制
filename <- '/tmp/test.hdf5'

if(file.exists(filename)) {
  file.remove(filename)
}

h5createFile(filename)
fid <- H5Fcreate(filename)    
g2 <- H5Gcreate(fid, "/metadata") 
dtype <- "H5T_C_S1"
sid <- H5Screate_simple(NROW(v))
g <- H5Dcreate(g2, "v", dtype, sid) 
H5Dwrite(g, v, h5spaceMem = sid, h5spaceFile = sid)
H5Dclose(g)
H5Sclose(sid)
h5closeAll()

但当我读到:

代码语言:javascript
复制
> h5read(filename,"/metadata/", bit64conversion="bit64")
$v
[1] "" "" "" ""

完全是空白的。维度和类型都是正确的,但是没有内容。

您可以看到它/那里/但我不能提取数据:

代码语言:javascript
复制
> h5ls(filename, all=TRUE)
      group     name         ltype corder_valid corder cset       otype
0         / metadata H5L_TYPE_HARD        FALSE      0    0   H5I_GROUP
1 /metadata        v H5L_TYPE_HARD        FALSE      0    0 H5I_DATASET
  num_attrs dclass      dtype  stype rank dim maxdim
0         0                             0           
1         0 STRING H5T_STRING SIMPLE    1   4      4

我可以用hdf5 /读取/ rhdf5文件,也可以在python中使用h5py写/写,这样我就知道机器是用正确的二进制文件设置的,用于hdf5访问。但是,我不能用R写hdf5字符向量,我做错了什么呢?

EN

回答 2

Stack Overflow用户

发布于 2019-12-01 11:10:12

为什么不直接做这样的事:

代码语言:javascript
复制
if(file.exists(filename)) {
  file.remove(filename)
}
h5createFile(filename)
h5createGroup(file = filename, group = "/metadata")
h5write(file = filename, obj = v, name = "/metadata/v")
h5closeAll()
h5ls(filename)
h5read(file = filename, name = "/metadata/v")
票数 0
EN

Stack Overflow用户

发布于 2022-06-07 15:16:47

这里的问题是,对于"H5T_C_S1"数据类型,您必须设置它要保存的字符串的长度。你可以通过:

代码语言:javascript
复制
tid <- H5Tcopy("H5T_C_S1")
H5Tset_size(tid, size = 4)

另一种选择是使用允许可变长度字符串的size = NULL。这两个选项之间的区别将在手册页中对h5createDataset()函数进行更详细的讨论。

为了完整起见,这里使用{rhdf5}写入并读取数据集。

代码语言:javascript
复制
library(rhdf5)

v <- c("val1", "val2", "cat", "dog")

filename <- tempfile(fileext = ".h5")
fid <- H5Fcreate(filename)    
g2 <- H5Gcreate(fid, "/metadata") 

## create a string datatype
tid <- H5Tcopy("H5T_C_S1")
## set a fixed size that accommodates all the strings to be written
H5Tset_size(tid, size = 4)

sid <- H5Screate_simple(NROW(v))
g <- H5Dcreate(g2, "v", dtype_id = tid, sid) 
H5Dwrite(g, v, h5spaceMem = sid, h5spaceFile = sid)

h5closeAll()


h5read(filename, name = "/metadata/")
#> $v
#> [1] "val1" "val2" "cat"  "dog"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59123506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档