2015-01-02 39 views
0

我會在開頭提到這個問題前注意到我很樂意考慮pytables的替代方法,但我更願意使用pytables來從numexpr特性中受益。存儲碎片(可變長度)的數組對象w/pytables

我正在尋找一個解決方案來存儲/探索/分析我的數據,例如以下形式:假設我有許多Event對象,代表某個時刻的某些實驗測量。每個Event包含一些標量字段,以及一個變量數Particle對象,其中每個對象都包含一些標量字段。見下面我的「繪圖」。

我的第一個想法是將每個Event作爲表中的一行。我知道pytables中有VLArray類型,但它們似乎只能存儲基本數據類型。有沒有辦法用pytables存儲這些數據?

我還認爲每個Event都是它自己的組,其中Particle表包含可變數量的行。但是,我預計會有數百萬Events,我希望能夠選擇事件並繪製某些字段,就像用表格中的行一樣。

如果用pytables無法做到這一點,有什麼替代解決方案?

+-------------------------+ 
    +-------------------------+ | 
+--------- Event ---------+ | | 
| timestamp (int)  | | | 
| temperature (float) | | | 
| latitude  (float) | | | 
| longitude (float) | | | 
| ... [etc]...   | | | 
|       | | | 
| +-- Particle<1> --+ | | | 
| | idx (int) | | | | 
| | energy (float) | | | | 
| | x  (float) | | | | 
| | y  (float) | | | | 
| | z  (float) | | | | 
| | ... [etc] ... | | | | 
| +-----------------+ | | | 
|   ...   | | | 
| +-- Particle<N> --+ | | | 
| | idx (int) | | | | 
| | energy (float) | | | | 
| | x  (float) | | | | 
| | y  (float) | | | | 
| | z  (float) | | | | 
| | ... [etc] ... | | | + 
| +-----------------+ | + 
+-------------------------+ 

回答

0

你可以用兩個表來做它的數據庫風格。一個事件:

+-------------------------+ 
    +-------------------------+ | 
+--------- Event ---------+ | | 
| timestamp (int)  | | | 
| temperature (float) | | | 
| latitude  (float) | | + 
| longitude (float) | + 
+-------------------------+ 

而且一個粒子,以「外鍵」:

+-------------------------+ 
    +-------------------------+ | 
+-------- Particle -------+ | | 
| event  (?)  | | | 
| idx   (int)  | | | 
| energy  (float) | | | 
| x   (float) | | | 
| z   (float) | | + 
| ... [etc] ...   | + 
+-------------------------+ 

類型的Particle.event可能是int指數爲Events表,也可以匹配id列添加到Events,或者它甚至可能是object類型,它實際上是指向Event的指針。他們都有不同的權衡。

您也可以通過將Event數據複製到每個Particle記錄中來「解除歸一化」。這可能會爲某些使用情況提供更好的性能,但會以犧牲存儲數據中的某些冗餘爲代價。