2010-11-09 138 views
2

當我使用NumPy時,我以原生格式* .npy存儲它的數據。它的速度非常快,給了我一些好處,像這樣的HDF5:存儲NumPy數據

  • 我能讀* .npy從C代碼爲 簡單的二進制數據(我的意思是* .npy是 二進制兼容與C結構)

現在我正在處理HDF5(此時PyTables)。正如我在教程中讀到的,他們使用NumPy序列化程序來存儲NumPy數據,所以我可以從簡單的* .npy文件中從C讀取這些數據?

HDF5的numpy是否也與C結構兼容?

UPD:

我MATLAB客戶端從HDF5閱讀,但不希望從C讀HDF5 ++,因爲從* .npy讀取二進制數據的速度更快的時間,所以我真的有在讀HDF5需要C++(二進制兼容) 所以我已經使用兩種方式傳輸數據 - * .npy(從C++讀取字節,從Python本地讀取)和hdf5(從Matlab訪問) 如果可能,想要使用只有一種方法 - hdf5,但要做到這一點,我必須找到一種方法來使hdf5與C++結構二進制兼容,請幫助,如果有某種方法可以關閉hdf5中的壓縮或其他方法來使hdf5二進制兼容用C++結構 - 告訴我在哪裏可以讀到它...

+0

你是說你已經在C++中使用代碼來讀取hdf5文件,並且你發現它比從.npy文件讀取要慢得多?另外,我確信matlab可以讀取原始的二進制文件,所以如果這是你使用hdf5的唯一原因,也許你應該仔細閱讀將.npy文件讀入matlab。 – DaveP 2010-11-09 22:23:54

+0

不,我正在讀取C++中的* .npy作爲二進制數據,並且想用hdf5來完成這個技巧。從MATLAB讀* .npy看起來很成問題 – 2010-11-10 08:16:02

+0

默認情況下,HDF5沒有壓縮。 – Yossarian 2013-05-15 12:58:20

回答

1

我感到你的痛苦。我一直在廣泛處理以HDF5格式存儲的大量數據,並且我收集了一些您可能會覺得有用的信息。

如果你在文件創建的「控制」(並且寫入數據 - 即使你使用API​​),你應該能夠在很大程度上完全規避HDF5庫。

如果輸出數據集沒有分塊,它們將被連續寫入。只要你沒有在數據類型定義中指定任何字節順序轉換(即你指定的數據應該用本地浮點/雙精度/整數格式編寫),你應該能夠達到「二進制兼容」它。

爲了解決我的問題,我寫了使用文件規範http://www.hdfgroup.org/HDF5/doc/H5.format.html

有了一個相當簡單的解析器HDF5文件分析器,你應該能夠識別偏移(和大小)的任何數據集。在這一點上,只需fseek和fread(在C中,也就是說,可以在C++中採用更高級別的方法)。

如果你的數據集是分塊的,那麼需要更多的解析來遍歷用於組織塊的b-樹。

你應該知道的唯一的其他問題是處理任何(或消除)任何系統相關的結構填充。

+0

填充不會是一個問題,我會解決它。感謝您的回覆 – 2010-11-10 08:25:07

+0

你介意嗎?分享你的分析器? – 2012-03-18 16:14:35

+0

沒有人需要像這樣訪問數據。如果您堅持使用HDF5的性能原則,那麼這太冒險了,如果不是真的要提高速度。不僅如此,但如果有人不使用本地類型或在數據集中有更多的填充/變量呢?誰知道客戶端平臺會吐出什麼。這是脆弱和危險的建議,這爲HDF5製造的原因打了很大的一部分。 – 2015-05-03 01:59:16

9

從C中讀取hdf5文件的正確方法是使用hdf5 API - 請參閱tutorial。原則上,可以像使用.npy文件一樣直接從hdf5文件讀取原始數據,前提是您尚未在hdf5文件中使用高級存儲選項(如壓縮)。然而,這基本上違背了使用hdf5格式的整個觀點,我不能想到這樣做的好處,而不是使用合適的hdf5 API。還要注意,API有一個simplified high level version這應該使從C讀取相對無痛。

+0

看到我的更新,我添加了一些細節。你可以寫更多關於直接從hdf5中讀取原始數據(以及如何關閉hdf5中的壓縮和其他存儲選項) – 2010-11-09 13:58:59

0

HDF5負責爲您提供結構的二進制兼容性。你只需要告訴它你的結構是由什麼組成的(dtype),並且你不會在保存/讀取記錄數組時遇到問題 - 這是因爲類型系統在numpy和HDF5之間基本上是1:1。如果你使用H5py,我敢肯定地說IO應該足夠快,只要你使用所有本地類型和大批量讀/寫 - 允許的整個數據集。之後,它取決於分塊和什麼過濾器(例如,混洗,壓縮) - 有時也值得注意的是,這些可以通過大大減少文件大小加速,所以總是看基準。請注意,類型和過濾器選項是在創建HDF5文檔的末尾進行的。

如果你想自己解析HDF5,那麼你做錯了。如果您使用C++/C,請使用C++和C apis。在HDF5網站上有一些所謂的「複合類型」的例子。