2010-11-08 158 views
10

我需要幫助做出決定。我需要在應用程序中傳輸一些數據,並且必須在這三種技術之間進行選擇。 我已閱讀有關所有技術一點點(教程,文檔),但仍不能決定...谷歌協議緩衝區,HDF5,NumPy比較(傳輸數據)

他們如何比較?

我需要支持的元數據(能力接收文件,無需任何額外的信息/文件閱讀),快速讀/寫操作,有能力來存儲動態數據將是一個加號(如Python對象)

事我已經知道:

  • NumPy是非常快但不能存儲動態數據(如Python對象)。 (關於元數據呢?)
  • HDF5速度非常快,支持自定義屬性,易於使用,但不能存儲Python對象。 也HDF5本地串行化NumPy數據,所以,恕我直言,NumPy沒有HDF5的優勢
  • Google Protocol Buffers也支持自我描述,速度很快(但Python支持當前時間較慢,而且緩慢)。可以存儲動態數據。缺點 - 自我描述不適用於Python,大於等於1 MB的消息不是很快(讀取「慢」)的序列化/反序列化。

PS:數據I需要轉移是NumPy的/ SciPy的(陣列,複雜結構的陣列等)的 「工作的結果」

UPD:需要跨語言訪問(C/C++/Python)的

+0

如果您正在考慮HDF5,請使用PyTables。 http://www.pytables.org/moin它基本上允許您構建類,以便輕鬆快速地將元數據和numpy數組存儲,重新創建和查詢到HDF5。因爲它只是將內容存儲到HDF5中,所以您應該能夠通過常用的庫輕鬆訪問C/C++中的內容。 – 2010-11-08 17:43:05

+0

是的,我知道PyTables,你很容易使用和跨語言,但他們不允許我存儲Python對象... – 2010-11-08 18:05:37

回答

11

在你的問題中似乎存在一個微小的矛盾 - 你希望能夠存儲Python對象,但是你也想要C/C++訪問。我認爲,無論您選擇哪種選擇,您都需要將您喜歡的Python數據結構轉換爲更多靜態結構,例如數組。

如果您需要跨語言訪問,我會建議使用HDF5,因爲它是專門設計爲獨立於語言,操作系統,系統架構的文件格式(例如在加載時可以在大端和小端自動),專門針對做科學/數值計算的用戶。我對Google協議緩衝區瞭解不多,所以我不能在這方面做太多的評論。

如果您決定使用HDF5,我還建議您使用h5py而不是pytables。這是因爲pytables創建了帶有大量額外pythonic元數據的HDF5文件,這使得讀取C/C++中的數據更加痛苦,而h5py不會創建任何這些額外內容。你可以找到一個比較here,他們也給出了關於這個問題的pytables FAQ的鏈接,所以你可以決定最適合你的需求。

與HDF5非常相似的另一種格式是NetCDF。這也有Python綁定,但是我沒有使用這種格式的經驗,所以除了指出它存在並且還被廣泛用於科學計算之外,我不能真正評論它。

+0

感謝您的迴應。我知道這三個人可能都不能完全滿足我的需求,這就是爲什麼我在這裏提出問題,選擇真的有點難。 PS閱讀Google昨天緩衝文檔,並發現一個有趣的事情:它們不是設計用於傳輸大量數據(> 1MB),因此認爲決定是關於NumPY和HDF5 .. – 2010-11-09 08:07:47

+1

PyTables添加的元數據是非常不顯眼的,只是數據集的一些額外屬性。您可以通過設置'tables.parameters.PYTABLES_SYS_ATTRS = False'或使用命名參數'PYTABLES_SYS_ATTRS = False'打開文件來關閉它。 – AFoglia 2010-11-09 20:48:43

+0

另外,讓我補充一點,PyTables非常易於使用,與C/C++ API h5py轉換不同。 h5py方法的好處是,如果兩個API相似,學習這兩種API的速度會更快。 – AFoglia 2010-11-09 20:50:47

2

我不知道HDF5,但你可與NumPy陣列店Python對象,你只是通過禁止C級業務失去了所有重要的功能,可以在陣列上執行。

In [17]: x = np.zeros(10, dtype=np.object) 
In [18]: x[3] = {'pants', 10} 
In [19]: x 
Out[19]: array([0, 0, 0, set([10, 'pants']), 0, 0, 0, 0, 0, 0], dtype=object) 
+0

對不起,忘了寫...我需要跨語言訪問...... (來自C/C++) – 2010-11-08 17:21:34