一种可配置合并取值的cim内存库加载方法
【技术领域】
[0001]本发明涉及电力系统的数据处理方法,具体来说涉及一种可配置合并取值的CIM内存库加载方法。
【背景技术】
[0002]国际电工技术委员会IEC定义了一种电力系统通用信息模型CIM (CommonInformat1n Model,通用信息模型)。CIM提供了一个关于电力系统信息的全面逻辑视图,是一个代表电力企业所有主要对象的抽象模型,包括了这些对象的公有类和属性,以及它们之间的关系。
[0003]使用CIM描述电力系统数据使得每种业务对象都有了一个特定的类名,包含明确的属性和关联定义,便于对数据进行统一描述和管理,也使得将电力设备对象之间映射成面向对象编程语言中的内存对象成为可能。属性是CIM类中的字段。
[0004]在电力自动化分析等领域,将按照CM组织的对象加载到内存中进行业务逻辑分析处理的作为已经很常见,但多数是轻量级模型,数据量在几十万对象,而百万甚至千万级的数据平台很少有通过内存库提高数据访问效率的做法。
[0005]按照CIM组织的电力系统数据有一定的数据特点和规律,例如一百万个设备的电压等级字段有一百万个值,但实际上只有“5001^”、“2201^”、“1101^”、“351^”和“101^”这六个取值,不需要占用一百万个字符串存储单元。有些属性取值很长,但可以分段,且但部分重复,例如对象的路径名,前半部分多数是重复的。针对这些规律可以找到一个存储与效率折中的加载方法,减少CIM内存库对资源占用,扩大CIM内存库的应用范围。
[0006]现有的方法是直接加载CIM模型中的属性值到内存中构建CIM内存库是最常用的方式,每一个有值的属性取值都会被分配一个存储单元。这样的方法对于大量取值相同或相近的字符串类属性值,占用大量的内存空间,内存使用量随着对象数呈线性增长,很难承受巨大的数据量。
[0007]另外一种方法是内存库中只做基本的初始化和内存存储,属性取值不存储在内存中,或者选择性存储,对大量占内存大的字符串类型属性不建立内存存储,当查询时动态向服务器或数据库查询,用于满足基于对象数据访问或者strutS2等自动化框架对内存库的要求。实际上这种方法是一种假内存库,因为全部或部分属性没有保存在内存中,查询时需要反复与服务器进行交互,查询效率极低,只能满足有些界面显示或手动查询操作,很难对自动化分析业务提供支持。
【发明内容】
[0008]本发明的目的在于根据电力系统CIM模型数据的特点,发现数据重复的规律,设计出CIM内存库加载优化方案。本发明的可配置合并取值的CIM内存库加载方法将通过合并字符串类型属性中相同的取值,并将长字符串分段以多个对象引用来替代,实现内存的缩减。
[0009]本发明的目的可通过以下的技术措施来实现:
[0010]一种可配置合并取值的CIM内存库加载方法,包括如下步骤:
[0011]第一步:配置合并属性
[0012]根据数据特点,配置需要合并的属性。对于重复性高的属性,配置其需要合并属性值的标识,记录在配置文件中,以便后续步骤能够识别该属性是否需要进行取值合并。例如可将导电设备的voltageLevel属性设置为取值合并,则后续步骤再遇到导电设备的voltageLevel属性时会进行进一步处理。
[0013]第二步:配置属性分段规则
[0014]对于可根据明确规则分段的长字符串属性,将字符串分段后与其他对象的属性取值比较,重复的概率更高,则进行分段处理。属性分段处理需要配置分段规则。
[0015]属性的分段规则包括分隔符(如“/”)和分割点,即在第几段进行分隔比较。例如两个长字符串属性取值选择前6段比较和选择前4段比较重复的概率是不一样的,比较的段数越少,重复的概率越大,但剩余内容的重复性也越高。因此需要根据数据的特点选择最优的分隔点。根据分段规则可通过编程语言的字符串处理方法如String, split或String,substring对字符串进行分隔。
[0016]一个属性可以配置多个分隔点,这样一个字符串就被分隔成多个字符串进行比较、合并。
[0017]分割点配置示例如下:
[0018]IdentifiedObject.pathName/24
[0019]表示IdentifiedObject.pathName属性以“/”为分隔符,通过第二个和第四个分隔符将字符串分割成三段。
[0020]第三步:建立映射表
[0021 ] 建立字符串属性取值内容到字符串内存对象的映射表,根据不同语言的特点,映射表采用哈希映射表或二叉树映射表,优选哈希映射表。
[0022]第四步:设置属性值
[0023]当为属性设置字符串取值时,若该属性设置了合并,则到第三步构造的映射表中查询是否存在该字符串取值的内存对象,如果存在,被设置的属性直接使用已存在的字符串内存对象;如果不存在,先向映射表中插入这个字符串内存对象,然后再让被设置的属性使用这个映射表中的字符串内存对象。
[0024]对于分段属性,首先根据要分的段数为属性申请数组。然后将要设置的字符串取值按配置的分段规则分隔成相应的段数,每一段到第三步构造的映射表中查询是否已存在相同的字符串。如果存在,则直接将映射表中的字符串内存对象放到数组中;如果不存在,先将本段字符串内存对象插入到映射表,同时存放在数组中。
[0025]第五步:获取属性值
[0026]对于设置了简单合并且不需要分段处理的属性,获取属性值时直接返回该属性使用的字符串内存对象即可。对于配置了分段处理的属性,需要将属性值数组中的分段字符串组合成新的字符串对象返回。
[0027]本发明对比现有技术,有如下优点:
[0028]本方法可以在基本不影响效率的情况下,有效的减少基于CIM的面向对象内存库的资源占用,对于含义大量重复的字符串属性的电力模型尤其明显。内存占用的大幅减少使得重量级数据平台的内存库构建不再受过高的内存要求限制,能够进行快速业务分析和提供高速数据访问能力。
【具体实施方式】
[0029]在数据结构存储中,数据类型可划分为对象引用、数字和字符串三大类