使用HDFView可视化ILNumerics API编写的大数据?

时间:2014-08-07 11:40:17

标签: hdf5 ilnumerics

我使用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中的数据。有什么指针吗?感谢

2 个答案:

答案 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
}

如果由于某些原因您在创建数据集时没有真正的初始数据,您可能

  • 将创建延迟到这些数据可用的时间,或
  • 在数据集构造函数上使用虚拟数据以确定块大小