一種動態(tài)加載性質(zhì)的cim內(nèi)存庫生成方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及電力系統(tǒng)數(shù)據(jù)處理方法,具體來說涉及一種動態(tài)加載性質(zhì)的CM內(nèi)存 庫生成方法。
【背景技術(shù)】
[0002] 國際電工技術(shù)委員會IEC定義了 一種電力系統(tǒng)通用信息模型CIM (Common Information Model,通用信息模型)。CIM提供了一個關(guān)于電力系統(tǒng)信息的全面邏輯視圖, 是一個代表電力企業(yè)所有主要對象的抽象模型,包括了這些對象的公有類和屬性,以及它 們之間的關(guān)系。
[0003] 使用CIM描述電力系統(tǒng)數(shù)據(jù)使得每種業(yè)務(wù)對象都有了一個特定的類名,包含明確 的屬性和關(guān)聯(lián)定義,便于對數(shù)據(jù)進(jìn)行統(tǒng)一描述和管理,也使得將電力設(shè)備對象之間映射成 面向?qū)ο缶幊陶Z言中的內(nèi)存對象成為可能。CIM類中屬性和關(guān)聯(lián)的統(tǒng)稱為性質(zhì)。當(dāng)對象性 質(zhì)取值為空的時讀取該性質(zhì)得到的值為缺省值。
[0004] 在電力自動化分析等領(lǐng)域,將按照CM組織的對象加載到內(nèi)存中進(jìn)行業(yè)務(wù)邏輯分 析處理的作為已經(jīng)很常見,但多數(shù)是輕量級模型,數(shù)據(jù)量在幾十萬,而百萬甚至千萬級的數(shù) 據(jù)平臺很少有通過內(nèi)存庫提供數(shù)據(jù)訪問效率的做法。
[0005] -種是通過代碼生成工具直接將CM類中的類、屬性、關(guān)聯(lián)映射成編程語言中的 類、屬性和引用是常用的內(nèi)存庫生成方法。CIM中的每個性質(zhì),都被生成了實(shí)體變量,加載數(shù) 據(jù)后,無論是否取值都會占用8個字節(jié)的內(nèi)存空間。這種方法的缺點(diǎn)在于:第一:對于取值 稀疏的電力模型,即CM模型中某類的屬性多,而實(shí)際數(shù)據(jù)中屬性取值多數(shù)為空的情況下, 內(nèi)存浪費(fèi)很多?,F(xiàn)實(shí)情況中,由于CIM模式的業(yè)務(wù)覆蓋率廣,對象性質(zhì)定義很多,多數(shù)CM 屬性有值的概率不到一半,對于千萬對象級數(shù)據(jù),至少有幾個G的內(nèi)存被浪費(fèi),也使得低配 置的硬件環(huán)境無法支撐大數(shù)據(jù)量的內(nèi)存庫。第二:由于CIM對象的性質(zhì)還有缺省值的概念, 對于未設(shè)置值的屬性不能簡單的用null代替,因?yàn)閷傩杂锌赡鼙辉O(shè)置了 null值,這種情 況不能應(yīng)用缺省值。因此需要額外為每個對象定義一個bool型的是否設(shè)置了取值的標(biāo)識, 每個性質(zhì)多占4個字節(jié)的內(nèi)存。
[0006] 此外,采用通用的對象描述構(gòu)建內(nèi)存庫是另一種構(gòu)建方式。此種方式使用一個通 用的數(shù)據(jù)類型來描述所有對象,所有的屬性、關(guān)聯(lián)以映射表的方式存儲在內(nèi)存中。這種做 法只保存有值的對象,沒有值的性質(zhì)不占用內(nèi)存。這種基于對象通用描述和性質(zhì)映射表的 CM內(nèi)存庫缺點(diǎn)在于:第一:不能發(fā)揮面向?qū)ο笤谔匦?,無法使用get、set方法直接訪問對 象屬性,也不能為特定的類增加會修改方法實(shí)現(xiàn)。第二:性質(zhì)映射表采用key-value方式存 儲,每個key都是一個字符串,還有每個對象映射表本身所占的內(nèi)存,使得有對象的性質(zhì)內(nèi) 存占用量翻倍。第三:當(dāng)進(jìn)行性質(zhì)訪問時,必須進(jìn)程字符串比較才能從映射表中定位到性質(zhì) 取值,字符串方式比較效率低,即使采用hash算法,也有一定的性能損失。
【發(fā)明內(nèi)容】
[0007] 本發(fā)明的目的在于提供一種動態(tài)加載性質(zhì)的CIM內(nèi)存庫生成方法,本方法可以在 基本不影響效率的情況下,有效的減少基于CIM的面向?qū)ο髢?nèi)存庫的資源占用,對于取值 稀疏的電力模型尤其明顯的。內(nèi)存占用的大幅減少使得重量級數(shù)據(jù)平臺的內(nèi)存庫構(gòu)建不再 受過高的內(nèi)存要求限制,能夠進(jìn)行快速業(yè)務(wù)分析和提供高速數(shù)據(jù)訪問能力。
[0008] 本發(fā)明的目的可通過以下的技術(shù)措施來實(shí)現(xiàn):
[0009] -種動態(tài)加載性質(zhì)的CIM內(nèi)存庫生成方法,包括如下步驟:
[0010] 第一步:生成元信息代碼
[0011] 根據(jù)CIM模型生成靜態(tài)代碼,包括類名、性質(zhì)名稱到靜態(tài)索引號的映射、性質(zhì)名稱 到數(shù)據(jù)類型的映射、性質(zhì)的缺省值。
[0012] a)將CM模型中的每一個類生成相同名稱的代碼類;
[0013] b)為所述代碼類中的屬性生成代碼中的字段,所述字段的名稱和數(shù)據(jù)類型與CIM 模型相同;
[0014] C)為所有字段生成缺省值靜態(tài)常量,CM模型里有缺省值的常量取值為缺省值, 沒有缺省值的常量取值為空;
[0015] d)為每個字段生成一個整型性質(zhì)靜態(tài)索引號,從0開始;
[0016] 第二步:生成性質(zhì)信息代碼
[0017] 在每個所述代碼類中定義一個性質(zhì)取值數(shù)組,用于動態(tài)存儲性質(zhì)取值,數(shù)組的大 小初始為0,即空數(shù)組,在加載數(shù)據(jù)的時候根據(jù)實(shí)際有取值的性質(zhì)個數(shù)動態(tài)調(diào)整數(shù)組的大 小。另外根據(jù)CM模型中的類中性質(zhì)的個數(shù),定義一個或多個long型數(shù)據(jù)標(biāo)識,用來管理 性質(zhì)是否被設(shè)置取值以及配合在性質(zhì)取值數(shù)組中定位性質(zhì)。
[0018] 一個long型變量有64個bit,可以管理64個性質(zhì)。當(dāng)某個bit取值為1時,代表 該bit所對應(yīng)的性質(zhì)被設(shè)置了取值,性質(zhì)取值數(shù)組中為此性質(zhì)分配一個存儲單元;當(dāng)某個 bit取值為0時,代表此bit所對應(yīng)的性質(zhì)未設(shè)置取值,性質(zhì)取值數(shù)組中不會為其分配存儲 單元。
[0019] 第三步:定位性質(zhì),計(jì)算出用于在性質(zhì)取值數(shù)組中定位性質(zhì)的動態(tài)索引號;動態(tài) 索引號的計(jì)算過程為:根據(jù)性質(zhì)靜態(tài)索引號找到對應(yīng)的bit位,如果此bit位為1,計(jì)算出 在此bit位之前的bit位為1的個數(shù),就是此性質(zhì)的動態(tài)索引號;對于bit位為0的性質(zhì), 不存在動態(tài)索引號。
[0020] 第四步:設(shè)置性質(zhì)取值
[0021] 設(shè)置性質(zhì)取值首先判斷l(xiāng)ong型標(biāo)識中,性質(zhì)的靜態(tài)索引號所對應(yīng)的bit位的取 值。如果取值為1,則根據(jù)第三步找到相應(yīng)的存儲單元,將性質(zhì)取值存放到存儲單元中。
[0022] 如果對應(yīng)的bit為取值為0,說明當(dāng)前數(shù)組中沒有對應(yīng)的存儲單元,需要擴(kuò)充性質(zhì) 取值數(shù)組。首先開辟新的性質(zhì)取值數(shù)組,大小比原來大1,然后將當(dāng)前性質(zhì)靜態(tài)索引號之前 所有有值的性質(zhì)按順序拷貝到新的性質(zhì)取值數(shù)組,再將當(dāng)前性質(zhì)要設(shè)置的值放到性質(zhì)取值 數(shù)組的下一個元素,最后將當(dāng)前性質(zhì)靜態(tài)索引號之后的全部有值的性質(zhì)按順序拷貝到新性 質(zhì)取值數(shù)組中。將對象中記錄數(shù)組的引用指向新的性質(zhì)取值數(shù)組,如果必要,釋放舊的性質(zhì) 取值數(shù)組的內(nèi)存。
[0023] 第五步:獲取性質(zhì)取值
[0024] 如果long型標(biāo)識中表明進(jìn)行讀取訪問的性質(zhì)沒有設(shè)置值,即bit位為0,如果性質(zhì) 定義了缺省值就返回缺省值,否則返回空。
[0025] 本發(fā)明對比現(xiàn)有技術(shù),有如下優(yōu)點(diǎn):
[0026] 本發(fā)明是一種根據(jù)CM模型生成面向?qū)ο蟪绦虼a的方法。本方法不對每個CIM 性質(zhì)生成存儲變量和bool型的取值設(shè)置標(biāo)識,也不通過占內(nèi)存較多的映射表來存儲性質(zhì) 取值,而是通過一種基于數(shù)組的動態(tài)尋址算法來實(shí)現(xiàn)所有性質(zhì)的存儲和訪問,對于重量級 稀疏型電力模型,節(jié)省內(nèi)存特別明顯。
【具體實(shí)施方式】
[0027] -種動態(tài)加載性質(zhì)的CIM內(nèi)存庫生成方法,包括如下步驟:
[0028] 第一步:生成元信息代碼
[0029] 根據(jù)CIM模型生成靜態(tài)代碼,包括類名、性質(zhì)名稱到靜態(tài)索引號的映射、性質(zhì)名稱 到數(shù)據(jù)類型的映射和性質(zhì)的缺省值。
[0030] 第二步:生成性質(zhì)信息代碼
[0031] 根據(jù)CM類和性質(zhì)定義生成程序類,每個類中定義一個空數(shù)組,用于動態(tài)存儲性 質(zhì)取值。另外根據(jù)CIM類中性質(zhì)的個數(shù),定義一個或多個long型數(shù)據(jù)標(biāo)識,用來管理性質(zhì) 是否被設(shè)置取值以及配合在數(shù)組中尋址。
[0032] 一個long型變量有64個bit,可以管理64個性質(zhì)。當(dāng)bit取值為1時,代表該性 質(zhì)被設(shè)置了取值,性質(zhì)取整數(shù)組中會有一個與之對應(yīng)的存儲單元;當(dāng)bit取值為0時,代表 此性質(zhì)未設(shè)置取值,性質(zhì)取值數(shù)組中不會為其分配存儲單元。
[0033] 第三步:定位性質(zhì)
[0034] 因?yàn)樾再|(zhì)取值數(shù)組并不是為所有性質(zhì)分配存儲單元,不存在一一對應(yīng)關(guān)系,因此 第一步生成的性質(zhì)索引號不能直接用于訪問數(shù)組中的存儲單元。根據(jù)long型數(shù)據(jù)標(biāo)識的 取值和索引號可以計(jì)算出用于在數(shù)組中定位性質(zhì)的動態(tài)索引號。例如,性質(zhì)"name"的靜態(tài) 索引號是5,在它之前,索引號為0和3的也有值,其他為空,那么性質(zhì)"name"的動態(tài)索引號 為2。動態(tài)索引號并不是一直不變的,如果靜態(tài)索引號為4的性質(zhì)也被設(shè)置的取值,這時性 質(zhì)"name"的動態(tài)索引號就變成了 3。
[0035] 因?yàn)樾再|(zhì)取值數(shù)組并不是為所有性質(zhì)分配存儲單元,不存在一一對應(yīng)關(guān)系,因此 第一步生成的性質(zhì)靜態(tài)索引號不能直接用于訪問數(shù)組中的存儲單元。根據(jù)long型數(shù)據(jù)標(biāo) 識的取值和靜態(tài)索引號可以計(jì)算出用于在數(shù)組中定位性質(zhì)的動態(tài)索引號。
【主權(quán)項(xiàng)】
1. 一種動態(tài)加載性質(zhì)的CIM內(nèi)存庫生成方法,其特征在于包括如下步驟: 第一步:生成元信息代碼 a) 將CIM模型中的每一個類生成相同名稱的代碼類; b) 為所述代碼類中的屬性生成代碼中的字段,所述字段的名稱和數(shù)據(jù)類型與CIM模型 相同; c) 為所有字段生成缺省值靜態(tài)常量,CIM模型里有缺省值的常量取值為缺省值,沒有 缺省值的常量取值為空; d) 為每個字段生成一個整型性質(zhì)靜態(tài)索引號,從O開始; 第二步:生成性質(zhì)信息代碼 在每個所述代碼類中定義一個性質(zhì)取值數(shù)組,用于動態(tài)存儲性質(zhì)取值,數(shù)組的大小初 始為0,即空數(shù)組,在加載數(shù)據(jù)的時候根據(jù)實(shí)際有取值的性質(zhì)個數(shù)動態(tài)調(diào)整數(shù)組的大??;另 外根據(jù)CIM模型中的類中性質(zhì)的個數(shù),定義一個或多個long型數(shù)據(jù)標(biāo)識,用來管理性質(zhì)是 否被設(shè)置取值以及配合在性質(zhì)取值數(shù)組中定位性質(zhì); 第三步:定位性質(zhì),計(jì)算出用于在性質(zhì)取值數(shù)組中定位性質(zhì)的動態(tài)索引號;動態(tài)索引 號的計(jì)算過程為:根據(jù)性質(zhì)靜態(tài)索引號找到對應(yīng)的bit位,如果此bit位為1,計(jì)算出在此 bit位之前的bit位為1的個數(shù),就是此性質(zhì)的動態(tài)索引號;對于bit位為0的性質(zhì),不存 在動態(tài)索引號; 第四步:設(shè)置性質(zhì)取值 設(shè)置性質(zhì)取值首先判斷l(xiāng)ong型標(biāo)識中,性質(zhì)的靜態(tài)索引號所對應(yīng)的bit位的取值;如 果取值為1,則根據(jù)第三步找到相應(yīng)的存儲單元,將性質(zhì)取值存放到存儲單元中; 如果對應(yīng)的bit為取值為0,說明當(dāng)前數(shù)組中沒有對應(yīng)的存儲單元,需要擴(kuò)充性質(zhì)取值 數(shù)組;首先開辟新的性質(zhì)取值數(shù)組,大小比原來大1,然后將當(dāng)前性質(zhì)靜態(tài)索引號之前所有 有值的性質(zhì)按順序拷貝到新的性質(zhì)取值數(shù)組,再將當(dāng)前性質(zhì)要設(shè)置的值放到性質(zhì)取值數(shù)組 的下一個元素,最后將當(dāng)前性質(zhì)靜態(tài)索引號之后的全部有值的性質(zhì)按順序拷貝到新性質(zhì)取 值數(shù)組中;將對象中記錄數(shù)組的引用指向新的性質(zhì)取值數(shù)組,如果必要,釋放舊的性質(zhì)取值 數(shù)組的內(nèi)存; 第五步:獲取性質(zhì)取值 如果long型標(biāo)識中表明進(jìn)行讀取訪問的性質(zhì)沒有設(shè)置值,即bit位為0,如果性質(zhì)定義 了缺省值就返回缺省值,否則返回空。
【專利摘要】本發(fā)明的目的在于提供一種動態(tài)加載性質(zhì)的CIM內(nèi)存庫生成方法,包括如下步驟:第一步:生成元信息代碼;第二步:生成性質(zhì)信息代碼;第三步:定位性質(zhì);第四步:設(shè)置性質(zhì)取值;以及,第五步:獲取性質(zhì)取值。本方法不對每個CIM性質(zhì)生成存儲變量和bool型的取值設(shè)置標(biāo)識,也不通過占內(nèi)存較多的映射表來存儲性質(zhì)取值,而是通過一種基于數(shù)組的動態(tài)尋址算法來實(shí)現(xiàn)所有性質(zhì)的存儲和訪問,對于重量級稀疏型電力模型,節(jié)省內(nèi)存特別明顯。
【IPC分類】G06F9-445
【公開號】CN104809008
【申請?zhí)枴緾N201510119258
【發(fā)明人】高雅, 杜雙育, 王紅斌, 范穎, 謝善益, 楊強(qiáng), 王彬, 馬金寶
【申請人】廣東電網(wǎng)有限責(zé)任公司電力科學(xué)研究院, 威海欣智信息科技有限公司
【公開日】2015年7月29日
【申請日】2015年3月18日