經常有客戶問,使用你們的實時資料庫,該如何計算存貯一年歷史資料所需要的磁碟空間?
讓我們以乙個具體例子進行說明吧:乙個專案中,總共有
1萬個模擬量測點,這些測點平均每秒變化一次,每次變化均要儲存,存貯一年歷史資料,需要多少磁碟空間?
為了很好地說明這個問題,我們先來分析一下,如果採用關聯式資料庫來儲存這些歷史資料,需要多少磁碟空間。假定關聯式資料庫採用乙個表來儲存歷史資料,表的格式定義如下:
欄位名
型別
長度
備註
tagid整型
4位元組測點編號,
1萬個測點只需
2位元組整型,但考慮到最大儲存測點可能超過
65536
,因此,定義為
4位元組整型
second整型
4位元組 秒
millsecond
短整型 2位元組
毫秒quality位元組
1位元組質量戳
value
雙精度數 8
位元組 值
關聯式資料庫中,計算歷史資料應考慮如下幾個方面的因素: l
管理檔案 l
**式描述頭 l
資料 l索引
其中,管理檔案及**式描述頭可以忽略不計,只需要考慮資料和索引即可。另外,在此也不考慮日誌檔案的大小。
假定關聯式資料庫中不對資料進行任何壓縮,採用定時儲存,則資料容量的計算公式如下所示:
資料容量
=單條歷史資料的尺寸
*秒數
*分鐘數
*小時數
*天數
*測點數
所以,資料容量
=(4+4+2+1+8)*60*60*24*365*10000=5580g
假定對該表中的
tagid
、second
和millsecond
建立唯一索引,同時假定關聯式資料庫的索引結構為
b+樹索引,一般的
b+樹的利用效率在
40%左右,因此,索引大小的計算公式如下所示:
索引容量
=單條索引的尺寸
*秒數
*分鐘數
*小時數
*天數
*測點數
/0.4
所以,索引容量
=(4+4+2)*60*60*24*365*10000/0.4=7342g
因此,用關聯式資料庫儲存
10000
個每秒鐘變化一次的雙精度數,同時建立乙個索引,需要磁碟空間為:
12922g。
下面,我們再來計算一下實時資料庫的歷史資料容量的計算方法。
首先要說明,不同的實時資料庫對歷史資料採用了不同的存貯方法,因此,計算方法也各不相同,在此,僅以我們自己的實時資料庫為例,進行計算。
首先需要介紹一下我們的實時資料庫的特點: l
歷史資料按時間段分為多個檔案儲存,每個檔案儲存一段時間內的歷史資料,儲存一年的歷史資料大概需要
60個檔案; l
每段時間內的資料和索引儲存在同乙個檔案內; l
測點的id
與其它資料在檔案內分開儲存。
針對我們的實時資料庫,計算歷史資料應考慮如下幾個方面的因素: l
管理檔案 l
檔案頭
l資料 l
索引 其中,管理檔案的大小大概為
100k
左右,可以忽略。
檔案頭大小
=單個檔案頭大小
*所有歷史資料檔案頭大小
=512k*60=0.03g
,也可以忽略
在完全不壓縮的情況下,資料容量的計算公式為:
不壓縮資料容量
=單條歷史資料的尺寸
*秒數
*分鐘數
*小時數
*天數
*測點數
其中,單條歷史資料的尺寸已經過緊密化處理,只佔
14位元組,所以,資料容量
=14*60*60*24*365*10000=4111g
我們的實時資料庫採用了特殊的索引機制,不需要對每條資料進行索引,平均
200條資料才需要記錄一次索引,在完全不壓縮的情況下,索引容量的計算方法為:
不壓縮索引容量
=單條索引的尺寸
*秒數
*分鐘數
*小時數
*天數
*測點數
/200
所以,索引容量
=10*60*60*24*365*10000/200=15g
最後,再考慮壓縮率。採用不同的壓縮演算法會有不同的壓縮比,另外,還與壓縮率有關,這個沒有統一的計算公式。但是,在工程現場,一般而言,採用哈佛曼演算法的壓縮比為
15:1
左右,採用變化壓縮演算法的壓縮比為
20:1
左右,採用旋轉門演算法的壓縮比為
30:1
左右。如果再加上一些特殊的技術(如二次壓縮技術,質量戳與資料值分開儲存等),壓縮比可以達到
40:1
左右。我們就按
40:1
進行計算
壓縮後總容量
=(不壓縮資料容量
+不壓縮索引容量
)/壓縮比
所以,以上例子中,實時資料庫歷史資料總容量=(
4111+15
)/40=103g
注意,以上計算只考慮了雙精度數測點,如果系統中還有開關量、字串、單精度數,其中,開關量的變化可能非常緩慢,這些沒有準確的計算公式,可以近似地處理為,將以上結果再除以4。
最後,給出乙個在我們的實時資料庫中,大致計算歷史資料容量的公式:
歷史資料容量
=年數
*萬點數
*25/
平均變化一次的秒數
實時歷史資料庫技術 提綱
2 時間壓縮 採用差值法,可以用unsigned short int 甚至unsigned char來存貯時標。毫秒可採用unsigned char來存貯。3 質量碼 因為質量值相對穩定的,可考慮統計方法,只存好的質量。3 模擬量的存貯 a 基於差值的方法,可用乙個unsigned short in...
EDNA實時資料庫兩種取歷史資料值的方式
1.dnagetnexthistutc函式 根據游標乙個乙個值取 int i ezdnaapinet.ezdnaapi.history.dnagethistdirectrawutc szserver,szpoint,start,end,ref key if i 0 if pdvalue dlowli...
EDNA實時資料庫兩種取歷史資料值的方式
1.dnagetnexthistutc函式 根據游標乙個乙個值取 int i ezdnaapinet.ezdnaapi.history.dnagethistdirectrawutc szserver,szpoint,start,end,ref key if i 0 if pdvalue dlowli...