2016-11-22 55 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庫一旦使用過,就必須關閉。