2017-05-01 88 views
0

問題:我想爲我們的單元測試使用內存映射的HDF5文件。是否有可能從頭開始創建它們?使用文件映像操作(內存映射的hdf5文件)從頭開始創建hdf5文件

Status:我讀過HDF5文件映像操作document,並試圖應用它。根據使用的確切參數,我得到一個無效的文件標識符(-1),或者後續的數據集創建失敗。

通常我們的單元測試會寫入新的測試文件,模擬用戶將新創建的數據保存到磁盤上的文件。所以還沒有一個現有的文件。在閱讀hdf5文件映像操作的文檔時,假定設置了初始文件映像。我沒有 - 因爲我試圖通過測試儘可能地接近實際的用戶場景。這樣的文件可以從一個空的緩衝區創建嗎?

static const unsigned int FileSize = 1024 * 1024 * 100; 
std::vector<unsigned char> buffer(FileSize, 0);  // initialize buffer with zeroes 
int flags = H5LT_FILE_IMAGE_DONT_COPY | 
      H5LT_FILE_IMAGE_OPEN_RW | 
      H5LT_FILE_IMAGE_DONT_RELEASE; 
m_file = H5LTopen_file_image(static_cast<void*>(buffer.data()), buffer.size(), flags); 

如果想保持緩衝區的所有權,如示例中我沒有得到有效的文件ID。我懷疑是HDF5中的一個bug,但不幸留下了標誌H5LT_FILE_IMAGE_DONT_COPY | H5LT_FILE_IMAGE_DONT_RELEASE輸出也沒有工作。

回答

0

顯然H5LTOpen_file_image包裝了一些也允許虛擬文件創建的調用。這是由核心文件驅動程序管理的。可以通過將一些參數傳遞給核心文件驅動程序來檢索所需的結果。

auto propertyList = H5Pcreate(H5P_FILE_ACCESS); 
auto h5Result = H5Pset_fapl_core(propertyList, m_buffer.GetSize(), false); 
assert(h5Result >= 0 && "H5Pset_fapl_core failed"); 
m_file = H5Fcreate(name, flags, H5P_DEFAULT, propertyList); 

調用H5Pset_fapl_core的最後一個參數設置爲「虛擬備份存儲」的布爾值。如果設置爲false,則文件內容不會寫入磁盤。

請注意,最後我不得不在開篇文章中引用的文檔中使用所有高級技巧,以確保所有功能正常工作。該文檔是一個很好的參考,但略有過時(在最新版本中,枚舉有不同但相似的命名)。