2016-11-22 58 views
0

我们在我们的.NET应用程序中集成了HDF5库。C#.net HDF5 Nunit问题?

由于HDF5库不是线程安全的,我们使用lock()封装了它。我们的程序的一个线程在单个和独占的.h5文件上工作。

一些计算是并行完成的。对于并行部分,我们使用:从

  • 线程
  • Parallel.foreach()

  • 的System.Threading
  • System.Threading.Tasks。

一切工作的时候,我们正在执行一些单元测试与NUnit的V3.2.1螺纹,parallel.foreach,每个的单个实例上的一个单一的.h5文件,最终值文件execpt(因为它们是读取和写入多次)在我们的.h5文件中是不正确的(否则它们是正确的)。

我们怀疑HDF5库对所有四种组合(HDF5,NUnit,Threads,Parallel.foreach)都有问题。我们并不清楚发生了什么。

工具:Visual Studio 2015 Pro,NUNit v3.2.1和NUnit3TestAdapter v3.5.1。

有什么建议吗?

在此先感谢。

这里是我们如何写我们的文件里面的一些数据的样本:

public void SetGroupAttribute(H5LocId hdf5Handle, string location, string attribute, int value) 
    { 
     lock (AccessLock) 
     { 
      // Retrieve the attribute to read 
      var attributeId = GetAttribute(hdf5Handle, location, attribute); 

      H5GroupId rootId = null; 
      if (attributeId != null) 
      { 
       // Remove the old attribute 
       rootId = H5G.open(hdf5Handle, location); 
       H5A.Delete(rootId, attribute); 
       H5G.close(rootId); 
      } 

      // Create and set the new attribute value 
      H5DataSpaceId spaceId = H5S.create(H5S.H5SClass.SCALAR); 
      var attributeType = H5T.copy(H5T.H5Type.NATIVE_INT); 

      rootId = H5G.open(hdf5Handle, location); 
      attributeId = H5A.create(rootId, attribute, attributeType, spaceId); 
      H5G.close(rootId); 

      // Set the attribute value 
      int[] dims = new int[1]; 
      dims[0] = value; 
      H5A.write<int>(attributeId, attributeType, new H5Array<int>(dims)); 
      H5A.close(attributeId); 
     } 
    } 
+0

如果您使用锁,使用'Parallel'有什么意义?此外,锁定不会使魔术变成线程安全的。 AcessLock是静态还是实例字段?其他人使用手柄吗? –

+0

我*不会*使用锁定来保护这样的资源。我会使用ActionBlock ](https://msdn.microsoft.com/en-us/library/hh194684(v = vs.110).aspx)将消息发布到使用单个任务执行修改的块。 –

+0

并行用于我们的不同计算(因为我们同时计算多个数据)。 AccessLock是一个单例内部的实例字段(对象)(其中.h5 IO方法在此处)。我会检查ActionBlock。谢谢! – Fabi1

回答

0

到目前为止,我解决了在做每一次下保持相同的配置(NUnit的,线程和Parallel.foreach)问题我编辑HDF5文件:

  1. 打开文件
  2. 待办事项IO操作
  3. 关闭文件
  4. 重新打开在读/写模式(H5F.OpenMode.ACC_RDWR)文件
  5. 关闭文件

每个操作通过使用我们的HDF5辅助单内部锁固定。这是因为一次一个线程正在处理一个.h5文件。

当您关闭.h5文件时,HDF5库似乎会执行异步操作,因为此步骤中的数据被推入文件中。

该文件不清楚。

我采取这种想法从这个线程: HDF5 Example code

HDF5文件约H5F.Close: http://hdf5.net/api/M_HDF5DotNet_H5F_close_1_4829088c.aspx

0

的问题现在已经解决了。

我们的操作之一忘了关闭HDF5文件中的数据集元素,导致H5F.Close无效。

症状:

  • 文件仍在使用的图书馆
  • 新的数据不会被刷新到文件

解决方案:

  • 检查从每一个对象HDF5库一旦使用过,就必须关闭。