使用java API如何获取给定路径的HDF文件结构
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用java API如何获取给定路径的HDF文件结构相关的知识,希望对你有一定的参考价值。
如根据文件路径,打开HDF5文件,如何获取文件下group集合!
参考技术A HDFS是Hadoop生态系统的根基,也是Hadoop生态系统中的重要一员,大部分时候,我们都会使用Linux shell命令来管理HDFS,包括一些文件的创建,删除,修改,上传等等,因为使用shell命令操作HDFS的方式,相对比较简单,方便,但是有时候,我们也需要通过编程的方式来实现对文件系统的管理。比如有如下的一个小需求,要求我们实现读取HDFS某个文件夹下所有日志,经过加工处理后在写入到HDFS上,或者存进Hbase里,或者存进其他一些存储系统。这时候使用shell的方式就有点麻烦了,所以这时候我们就可以使用编程的方式来完成这件事了,当然散仙在这里使用的是原生的Java语言的方式,其他的一些语言例如C++,php,Python都可以实现,散仙在这里不给出演示了,(其实散仙也不会那些语言,除了刚入门的Python) 。追问
大哥,我说的HDF文件处理,不是HDFS啊~
如何使用 C++ API 在 HDF5 文件中写入/读取锯齿状数组?
【中文标题】如何使用 C++ API 在 HDF5 文件中写入/读取锯齿状数组?【英文标题】:How to write/read jagged arrays in a HDF5 file using the C++ API? 【发布时间】:2020-06-15 22:34:11 【问题描述】:我有多个不同大小的 std::vector
包含浮点数。我想将它们作为 HDF5 文件中的锯齿状数组全部写入/读取(理想情况下,使用 hyperslabs 一个接一个,因为我不能同时将所有向量保存在内存中)。我相信我应该使用一个常规数组,它的每个元素都是可变长度数据类型,但我发现的所有示例都是 C 示例。我的代码如下所示:
#include <vector>
#include "H5Cpp.h"
int main()
std::vector<float> v1 0.1, 0.2, 0.3;
std::vector<float> v2 0.4, 0.5;
H5::VarLenType array_type (H5::PredType::NATIVE_FLOAT);
hsize_t dimensions[1] = 2;
H5::DataSpace dataspace (1, dimensions);
H5::H5File file ("jarray.h5", H5F_ACC_TRUNC);
H5::DataSet dataset = file.createDataSet("jarray", array_type, dataspace);
hsize_t size[1] = 1;
hsize_t offset[1] = 0;
dataspace.selectHyperslab(H5S_SELECT_SET, size, offset);
dataset.write(v1.data(), array_type);
return 0;
;
如果我忽略对write
函数的调用,代码将创建一个具有以下结构的空文件(由h5dump
打印):
HDF5 "jarray.h5"
GROUP "/"
DATASET "jarray"
DATATYPE H5T_VLEN H5T_IEEE_F32LE
DATASPACE SIMPLE ( 2 ) / ( 2 )
DATA
(0): (), ()
这让我相信数据集具有正确的结构,但我的写作部分没有正确。
有人可以澄清如何写入这样的数组吗?之后如何读取这些值?任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:不确定如何使用 HDF5 C++ API 执行此操作,但您可以尝试 HDFql,因为它可以让您从 HDF5 低级细节中解脱出来。在 C++ 中使用 HDFql,您可以执行以下操作来写入/读取 HDF5 锯齿状数组:
// create HDF5 file 'jarray.h5' and use (i.e. open) it
HDFql::execute("CREATE AND USE FILE jarray.h5");
// create HDF5 dataset 'jarray' of one dimension (size 2) as a variable-length float (i.e. jagged)
HDFql::execute("CREATE DATASET jarray AS VARFLOAT(2)");
// write 0.1, 0.2 and 0.3 in first row of dataset 'jarray', 0.4 and 0.5 in second row
HDFql::execute("INSERT INTO jarray VALUES((0.1, 0.2, 0.3), (0.4, 0.5))");
// read first row of dataset 'jarray' using an hyperslab and populate cursor with values
HDFql::execute("SELECT FROM jarray(0:::1)");
// display values of first row
while (HDFql::cursorNext() == HDFql::SUCCESS)
std::cout << *HDFql::cursorGetFloat() << std::endl;
// read second row of dataset 'jarray' using an hyperslab and populate cursor with values
HDFql::execute("SELECT FROM jarray(1:::1)");
// display values of second row
while (HDFql::cursorNext() == HDFql::SUCCESS)
std::cout << *HDFql::cursorGetFloat() << std::endl;
这是一个基于直接写入值的简短示例。如果您需要使用用户定义的内存(即变量)进行写入/读取,请查看reference manual 和examples 以获取更多信息。
【讨论】:
谢谢!我很惊讶在 HDF5 文档中没有提到 HDFql。这种语法比 C/C++ API 干净得多(并且显然有更好的文档记录)。暂时我将切换到 HDFql,尽管尽管作者可能声称,我有点担心效率不会完全相同。如果我设法使 C++ 版本工作,我会用基准报告。 如果您在 HDFql 中使用用户定义的内存(即变量)而不是游标(如上例所示),则效率不应该成为问题。此外,在处理大量 HDF5 数据时,I/O 成本最高,这意味着 HDFql 解释函数HDFql::execute
中传递的语句所需的额外 CPU 可以忽略不计(因为它对整体效率/性能没有实际影响)。以上是关于使用java API如何获取给定路径的HDF文件结构的主要内容,如果未能解决你的问题,请参考以下文章
我如何输入路径并在同一路径中创建所有 csv 文件的 hdf5 文件?