PI實時資料歷史記錄儲存機制

2022-06-02 09:06:07 字數 1163 閱讀 3879

在pi的很多文件上都提到了,儲存一條32位浮點型的變數的記錄平均只需5個位元組,以前就很難想明白pi是怎麼做到的。因為一條記錄至少需要包含三個欄位vqt(v:value,指變數值;q:quality,指資料質量;t:timestamp,指變數值對應的時間戳),對於32位浮點型變數而言,變數值v就需要4個位元組儲存,這就意味著q和t平均只占用乙個位元組,這幾乎不可能。

但pi做到了。當然可能其他品牌也有類似的design。

首先簡單介紹一下pi的歷史資料檔案的基本格式,pi的歷史資料都儲存在形如piarch.001這樣的資料檔案中,與之相對應的還有乙個形如piarch.001.ann這樣的檔案,後者是用來儲存針對變數記錄的注釋用的,一般很少使用。對於形如piarch.001這樣的資料檔案內部,pi採用的是分塊(分頁)的管理方式,每塊(頁)的大小為1024位元組,這實質上隱含限制了一條變數記錄的長度是不可能超過1000位元組的。頁從檔案開頭開始編號,第乙個頁號為0,用於儲存跟檔案相關的資訊。之後的頁就用於儲存變數歷史資料,每個變數初始被分配乙個頁用於儲存資料,隨著記錄的追加,更多的頁被分配給變數,當頁數多餘3時(根據我的觀察)時,pi採用如下的資料結構來組織變數資料(圖1)。

圖1 pi的歷史資料儲存結構

從圖1可以看到,pi採用的是一種兩層的簡單儲存結構,而不是大家通常想象的多層樹型結構(例如b+樹)。每一層相鄰的兩個頁之間是互相鏈結在一起的,同時葉子節點(記錄節點)也維護到父節點(索引節點)的反向引用指標。在索引節點上儲存的記錄是每個記錄節點的起始時間和對應的頁號。

對於歷史記錄的儲存,pi最核心的理念就是「不顧一切的盡可能縮減儲存記錄所需要的磁碟空間」,為了達到這個目標,pi採用的是變長記錄的儲存方式(注意:沒有關聯式資料庫裡面的所謂行偏移陣列),而且還不惜犧牲時間精度。對於時間戳t的儲存,pi採用的是差分法,即只儲存與前一條記錄的時間戳之差值,如果這個差值能夠用乙個位元組表示(通常單位為秒,不過依據pi的文件,好像還可能是更大的單位),那麼這個時間戳t就只需用乙個位元組表示;如果無法用乙個位元組表示,或者差值小於1秒,則使用多個位元組表示(2~5?)。對於質量戳q的儲存,pi的策略是如果該質量戳是好的(good),則不存;即只存壞質量戳,這通常意味著對於99.99%的資料記錄而言,不需要儲存質量戳。

如此一來,儲存一條32位浮點變數記錄平均只需5個位元組就很容易了。

檢視資料修改歷史記錄

create table tzy test name varchar2 10 addr varchar2 20 insert into tzy test values 張三 廣東 insert into tzy test values 李四 上海 insert into tzy test value...

本地儲存搜尋歷史記錄工具類

因為需要用到儲存本地搜尋,所以就提前寫一下工具,簡單說下分為3部分 新增搜尋記錄 獲取搜尋歷史記錄 清空搜尋記錄 基本就是這麼回事,實現也很簡單,define recordcount 5 最多儲存5條,自定義 define search history nsuserdefaults standard...

如何對錶中資料的修改做歷史記錄

現在有一張表user 裡面字段如下 userid 使用者帳號 唯一不可修改 username 使用者名稱 phone 手機號 email 郵箱 createtime 建立時間 updatetime 更新時間 比較low的方式是建立乙個記錄表user record 同樣包含以上字段,每次修改插入一條修...