我使用ILNumerics api将我的应用程序数据编写为H5Datasets。 使用小尺寸数据(5 X 4098),我可以使用HDFView(版本2.9)可视化数据。但是对于大小为30 x4098或更大的数据,当我尝试查看数据集表时,HDFView会无声地崩溃。
我没有使用任何压缩参数。这是我们可以用来重现问题的示例代码。
private void button1_Click(object sender, EventArgs e)
{
using (var file = new H5File("testwrite.h5"))
{
var ds = new H5Dataset("data");
file.Add(ds);
ds.Set(ILMath.rand(30,4096));
}
}
我需要能够可视化/复制H5file中的数据。有什么指针吗?感谢
答案 0 :(得分:1)
如果没有足够的内存来打开HDFView中的数据集,它将无法打开数据集。请参阅HDFView用户指南:
5.2子集和维度选择
打开整个大型数据集可能会导致“Out of Memory Error”,因为Java为 虚拟机无法创建所需的对象。 HDFView提供选择a的选项 用于显示的数据集的子集。您还可以选择尺寸和顺序 要显示的尺寸,例如,切换列和行。
但是,HDFView应该不崩溃并且应该给你一个" Out of Memory Error",但它并不总是这样做。在许多情况下,HDFView无法正确处理异常,我们正在努力纠正这些问题。
我能够创建一个大小为7000x7000的64位整数数据集,并在我的机器上使用HDFView 2.10.1查看它,但我的机器有很多内存。
如果您有一个分块的大型数据集,则可以查看子集,如“用户指南”的第5.2节所述。为此,右键单击数据集,然后选择" Open As"从弹出菜单中。将打开一个窗口,您可以从中选择要查看的数据集的子集。使用分块,只会读取包含子集的那些块, 所以整个数据集不必读入内存。
如果您想跟进,请与HDF集团服务台联系。 有关详细信息,请参阅此页:http://www.hdfgroup.org/about/contact.html
谢谢!
-Barbara
HDF服务台
答案 1 :(得分:0)
事实证明,问题的原因是由于数据集的块大小太小。
在ILNumerics中,块大小是从创建时使用的初始数据自动导出的。如果没有给构造函数提供数据,则块大小设置为1x1。
这是ILNumerics API中的次优设计。它应该防止用户意外地创建具有太小块大小的数据集。相反,在这里它甚至没有抱怨构造函数中缺少数据参数。我们将在下一个版本中使创建API更加明确。
为了解决问题,只需将某些数组提供给数据集的构造函数即可。给它一个你觉得合理的大小作为新数据集的块大小。请记住,块大小是一旦创建数据集就无法更改的东西!
using (var file = new H5File("testwrite.h5"))
{
var ds = new H5Dataset("data", ILMath.rand(30,4096));
file.Add(ds);
// ds.Set(ILMath.rand(30,4096)); <- this is not needed anymore
}
如果由于某些原因您在创建数据集时没有真正的初始数据,您可能