如何在JAVA中使用HDFql获取数据集中的字符串类型数据?

How to obtain a string type data in a dataset with HDFql in JAVA?

我是 HDF5 和 HDFql 的新手,我在 java 工作,我有一个包含多个组的 .h5 文件,在每个组中我有不同的数据集,有些是浮动数组,我得到如下。 https://gyazo.com/c10100b327d20a2db8c13f2fd9ab7668

 Double[][] values = new Double[numRow][numCol];
 HDFql.variableRegister(values);
 HDFql.execute("SELECT FROM "+gName+"/"+dName+" INTO MEMORY "+HDFql.variableGetNumber(values));
 HDFql.variableUnregister(values);

当我有一个变量为 1 行 1 列且数据类型为字符串的数据集时,就会出现问题。 https://gyazo.com/2622693aee83d9eba5487a053ba9247c

我尝试执行以下代码,但收到以下错误消息

  String[] val = new String[10];
  HDFql.variableRegister(val);
  HDFql.execute("SELECT FROM "+gName+"/"+dName+" INTO MEMORY "+HDFql.variableGetNumber(val));
  HDFql.variableUnregister(val);

String val = "";
HDFql.variableRegister(val);
HDFql.execute("SELECT FROM "+gName+"/"+dName+" INTO MEMORY "+HDFql.variableGetNumber(val));
HDFql.variableUnregister(val);

控制台显示的错误是:

A fatal error has been detected by the Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006da2f270, pid=42048, tid=0x00000000000089d4

JRE version: Java(TM) SE Runtime Environment (8.0_211-b12) (build 1.8.0_211-b12) Java VM: Java HotSpot(TM) 64-Bit Server VM (25.211-b12 mixed mode windows-amd64 compressed oops) Problematic frame: V [jvm.dll+0x27f270]

Failed to write core dump. Minidumps are not enabled by default on client versions of Windows

An error report file with more information is saved as: C:\Users\us\AppData\Local\Temp\hs_err_pid42048.log

If you would like to submit a bug report, please visit:
http://bugreport.java.com/bugreport/crash.jsp

欢迎任何帮助,非常感谢

即使数据集只有一个元素(在您的例子中,1 行 x 1 列),您仍然需要将变量(您注册以存储数据)声明为数组。换句话说,声明和创建变量 val 如下:

String val[] = new String[1];

此外,请查看 HDFql reference manual 中的第 5.2.51 节以了解您可以在 Java.

中注册什么类型的变量(使用方法 variableRegister

抱歉,我的回答延迟了。

问题依然存在,我找到了访问 1 Row x 1 Col 变量的方法。但是,问题似乎是另一个。

我有一个实现 HDFql 调用的方法,如下所示。 https://gyazo.com/c3bc1e4e568cb4277607fa21ea71445f

如果我从 class 构造函数调用 2 次方法 https://gyazo.com/9dee4e0b9a0ea69e73089b2802dbdad9 工作正常,结果我得到了我咨询过的两个数据集。 https://gyazo.com/40e4485408fe08e7cf9a1ad8baf97a9d https://gyazo.com/372fc6cb991992e82340325dfd0b548d

但是,当我尝试 运行 单击按钮时对侦听器使用相同的方法。 https://gyazo.com/928ee0b90e8b864fe6908b79e56da7a7 https://gyazo.com/f8c044e298208fa9f94c8be7bc5e1de3

Java发生错误,我将内存堆增加到最大8Gb,并在完成查询后释放HDFql的所有变量,但错误仍然存​​在。我不明白为什么如果调用是从构造函数进行的,即使它是几个连续的调用,它也有效,相反,如果调用是从构造函数以外的方法进行的,则返回下一个错误。

* Java 运行时环境检测到致命错误:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) 在 pc=0x0000000054f6f1c2,pid=137068,tid=0x0000000000014d88

JRE 版本:Java(TM) SE Runtime Environment (8.0_211-b12) (build 1.8.0_211-b12) Java VM:Java HotSpot(TM) 64 位服务器 VM(25.211-b12 混合模式 windows-amd64 压缩 oops) 有问题的框架: V[jvm.dll+0x15f1c2]

无法写入核心转储。 Windows

的客户端版本默认不启用小型转储

包含更多信息的错误报告文件保存为: C:\Users\Code\AppData\Local\Temp\hs_err_pid137068.log

如果您想提交错误报告,请访问: http://bugreport.java.com/bugreport/crash.jsp 崩溃发生在本机代码的 Java 虚拟机之外。 请参阅有问题的框架以了解在何处报告错误。 *

我正在使用 Vaadin 框架开发 Web 应用程序,我没有创建任何线程,但我认为当用户与浏览器的组件(按钮、组合框等)交互时,该框架可能会创建线程).我已经尝试 运行 构造函数中的方法,当您导航到该视图时 运行s,第一次导航它工作正常,但是,当您 return 导航或刷新网页无法访问。这就像 HDFql 正在缓存或保存以前访问的内存地址,当您再次浏览或单击按钮时,某些变量将更改其内存指针,而不是使用新指针,HDFql 正在尝试重用以前的内存地址。

方法: http://cpp.sh/8s5c3

日志: http://cpp.sh/3zgxa