一种基于动态系统结果数据的快速读写方法与流程

文档序号:12664078阅读:186来源:国知局

本发明属于计算机软件领域,尤其是大数据文件的读写效率提升的技术范畴,具体涉及一种特殊的文件格式以及对应的快速读写方法。



背景技术:

近年来仿真建模行业发展飞快,随之而来的是仿真模型的规模不断增大,仿真的结果数据文件也越来越大。常用来存放仿真结果的mat文件和csv文件在文件过大时,存在读写文件崩溃或者仿真结果读取过慢的问题。



技术实现要素:

为克服现有技术中的不足,本发明的目的在于提供一种基于动态系统结果数据的快速写读方法,其包括了快速写方法和快速读方法。该方法的实质是针对动态系统的仿真结果设计了一种特殊的文件格式,将仿真数据以分块为单位进行转置处理之后再写入结果文件,这样就减少了读取变量值的时候文件指针的偏移次数,从而提高了读取速度,同时,数据量过大时,会对结果文件进行拆分,将仿真数据存放在不同的文件中,解决了文件过大时读写变量数据崩溃的问题。

为实现上述技术目的,达到上述技术效果,本发明通过以下技术方案实现:

一种基于动态系统结果数据的快速写方法,其包括以下步骤:

步骤0、创建文件,写入文件头,所述文件头存储的信息包括文件标识、文件存储的字节序和文件版本号;

步骤1、写入索引表,所述索引表的信息包括变量引用、变量类型、变量所在表的类型和变量在表中的索引;

步骤2、写入固定表,所述固定表分为表头和表的数据;所述表头信息包括表名、表的类型、存储布局、表的数据类型、表的行列数和表的数据字节数;所述表的数据是存入该表格的变量的仿真数据;

步骤3、根据情况判断变量中是否有时变变量,若有,则继续下面步骤,若无,则文件写入完成,跳转至步骤8;

步骤4、逐个写入可变表的表头,所述表头信息包括表名、表的类型、存储布局、表的数据类型、表的列数、每一个分块的行数、每一个分块的字节数和是否有兄弟表的标识;

步骤5、若上层向逻辑层要求缓冲区,则所述逻辑层向所述上层提供一个缓冲区,并且开始接收仿真数据,所述缓冲区的大小由所述逻辑层决定,向所述上层提供所述缓冲区时告知所述缓冲区大小即可;若所述上层不请求所述缓冲区,则无仿真数据,文件写入完成,跳转至步骤8;所述上层是指使用本方法的软件模块;所述逻辑层负责结果读写的逻辑处理,包括请求处理、管理缓冲区和数据转置;

步骤6、所述缓冲区填满后,所述逻辑层接到通知,开始对所述缓冲区的数据进行转置处理,同时根据需求向上层提供另一块缓冲区;所述转置处理是指行变列、列变行;

步骤7、所述转置处理完成后,调用所述物理层的接口将所述缓冲区的数据写入文件,同时查看另一块缓冲区是否写入完成,若写入完成,则跳转到步骤5;所述物理层负责物理文件管理,包括将缓冲区数据写入文件、读取文件中的数据到缓冲区、计算文件指针偏移量、管理文件指针及拆分文件等;

步骤8、数据写入结束,若有可变表,则写入可表表尾,若无,则完成。

进一步的,调用所述物理层的接口将所述缓冲区的数据写入文件的步骤如下:

步骤701、计算偏移量,所述偏移量为数据起始处在文件中的位置,即相对文件头或者某一个已知位置偏移的字节数;

步骤702、判断所述偏移量是否超过限定的文件大小,若超过,则跳转至步骤3,若未超过,则跳转至步骤704;

步骤703、创建拆分文件,更新写入数据块的文件指针,跳转至步骤701;

步骤704、写入数据块,更新相关信息;

步骤705、写入完成。

本发明的基于动态系统结果数据的快速读方法,包括以下步骤:

步骤1、打开文件,读取文件头,读取索引表中固定表的表名、表的类型、存储布局、表的数据类型、表的行列数和表的数据字节数;可变表的表名、表的类型、存储布局、表的数据类型、表的列数、每一个分块的行数、每一个分块的字节数和是否有兄弟表的标识;

步骤2、根据要读取的变量的引用,读取所述变量在所述索引表中的索引信息;

步骤3、根据所述索引信息,判断所述变量是固定变量还是时变变量,若为固定变量,则跳转到固定变量读取步骤;若为时变变量,则跳转到时变变量读取步骤。

进一步的,所述固定变量读取步骤包括以下步骤:

步骤401、计算数据起始处偏移量;

步骤402、判断偏移量是否超过文件大小,若超过,则报错返回,若未超过,则继续后续步骤;

步骤403、计算实际可读取行数;

步骤404、将文件指针移动到数据起始处;

步骤405、读取单个元素数据;

步骤406、判断数据是否读取完成,若未读取完成,则移动文件指针到读取下一个元素的位置,并且跳转到步骤405;若读取完成,则跳转到步骤407;

步骤407、读取完成。

进一步的,所述时变变量读取步骤包括以下步骤:

步骤501、计算数据起始处偏移量;

步骤502、判断偏移量是否超过文件大小,若超过,则报错返回,若未超过,则继续后续步骤;

步骤503、计算实际可读取行数;

步骤504、将文件指针移动到数据起始处;

步骤505、读取所在分块的数据;

步骤506、判断本文件是否还有后续分块数据,若无,则跳转至步骤509;

步骤507、移动文件指针到下一个分块;

步骤508、判断缓冲区是否读满,若已经读满,则跳转到步骤511,若未读满,则跳转到步骤4;

步骤509、判断是否还有后续拆分文件,若无,则跳转到步骤511,如有,则执行下一步;

步骤510、期望换文件指针到下一个拆分文件,跳转至步骤504;

步骤511、读取完成。

本发明的技术原理如下:

1)文件格式:每个数据表有一个逻辑文件表示;每个文件中数据采用分段存储,每一个片段存放固定的行数(最后一段除外)的数据,片段内按列主存储;每个文件有固定的头部,其中有文件类型标志、版本号、大小端标志、数据类型、列数和片段的行数(最后一段除外)。

首先,写入文件固定的头部,然后按顺序写入数据,其后不会修改头部,这样,即使文件保存过程被中断,文件中前面保存的信息也能正确读取。采用列主存储读取更快更方便,解决变量数据太大时读取过慢的问题。采用分段存储更好地支持分段读取,避免一次读取大量数据时导致的崩溃问题。

2)读写操作:写入时使用多个缓冲区,当一个缓冲区写满后,立即进行行列转置并写入文件,而其他空闲的缓冲区继续接受数据写入,多个缓冲区可以循环利用;读入时,根据头部信息计算读入数据所在的片段和偏移,直接读取片段内变量相连的数据;

3)文件拆分:当文件大小达到一定规模时,创建一个新的文件继续写入仿真数据,每一个拆分文件达到规定的最大大小时,就继续创建新的拆分文件写入数据。这样就保证了单个结果文件不会过大,避免了因为文件过大导致的写入或读取数据崩溃的问题。

与现有技术相比,本发明具有以下有益效果:

本发明通过对仿真数据进行转置之后进行分段的存储,提高了结果数据的读写速度,在文件较大时尤为明显,提高近10倍;并且控制单个文件的大小,当文件大小过大时进行拆分,分批次进行写入和读取,提高的了结果文件的稳定性,避免数据量过大时读写文件的崩溃问题,并且文件大小在硬盘容量的范围内可以不受限制。

上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,并可依照说明书的内容予以实施,以下以本发明的较佳实施例并配合附图详细说明如后。本发明的具体实施方式由以下实施例及其附图详细给出。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1为本发明的基于动态系统结果数据的快速写读方法中所涉及的文件存储组织示意图。

具体实施方式

下面将参考附图并结合实施例,来详细说明本发明。

参见图1所示,以下实施例中所涉及的文件格式如下:

逻辑上文件的内容划分为两部分:文件头和数据。文件头记录文件的总体信息和数据表的信息,数据保存数据表的行列数据。

数据表分为行列数固定的表(固定表)和列数固定行数可变的表(可变表)。固定表整体按行主存储,可变表有两种存储方式,一种是分块按列主存储,另一种是与固定表一样按行主存储。一个文件中固定表可以是零到多个,可变表可以是零到一个。

在创建可变表之后,不可再创建固定表,即固定表必须在可变表之前创建,在创建可变表后,不可增删表和修改表信息。

当按分块列主存储并且列数过多时,内部用多个表保存数据,每个表只保存一部分列。

实施例1:

本实施例的基于动态系统结果数据的快速写方法,其包括以下步骤:

步骤0、创建文件,写入文件头,所述文件头存储的信息包括文件标识、文件存储的字节序和文件版本号;

步骤1、写入索引表,所述索引表的信息包括变量引用、变量类型、变量所在表的类型和变量在表中的索引;

步骤2、写入固定表,所述固定表分为表头和表的数据;所述表头信息包括表名、表的类型、存储布局、表的数据类型、表的行列数和表的数据字节数;所述表的数据是存入该表格的变量的仿真数据;

步骤3、根据情况判断变量中是否有时变变量,若有,则继续下面步骤,若无,则文件写入完成,跳转至步骤8;

步骤4、逐个写入可变表的表头,所述表头信息包括表名、表的类型、存储布局、表的数据类型、表的列数、每一个分块的行数、每一个分块的字节数和是否有兄弟表的标识;

步骤5、若上层向逻辑层要求缓冲区,则所述逻辑层向所述上层提供一个缓冲区,并且开始接收仿真数据,所述缓冲区的大小由所述逻辑层决定,向所述上层提供所述缓冲区时告知所述缓冲区大小即可;若所述上层不请求所述缓冲区,则无仿真数据,文件写入完成,跳转至步骤8;所述上层是指使用本方法的软件模块;所述逻辑层负责结果读写的逻辑处理,包括请求处理、管理缓冲区和数据转置;

步骤6、所述缓冲区填满后,所述逻辑层接到通知,开始对所述缓冲区的数据进行转置处理,同时根据需求向上层提供另一块缓冲区;所述转置处理是指行变列、列变行;

步骤7、所述转置处理完成后,调用所述物理层的接口将所述缓冲区的数据写入文件,同时查看另一块缓冲区是否写入完成,若写入完成,则跳转到步骤5;所述物理层负责物理文件管理,包括将缓冲区数据写入文件、读取文件中的数据到缓冲区、计算文件指针偏移量、管理文件指针及拆分文件等;

步骤8、数据写入结束,若有可变表,则写入可表表尾,若无,则完成。

进一步的,调用所述物理层的接口将所述缓冲区的数据写入文件的步骤如下:

步骤701、计算偏移量,所述偏移量为数据起始处在文件中的位置,即相对文件头或者某一个已知位置偏移的字节数;

步骤702、判断所述偏移量是否超过限定的文件大小,若超过,则跳转至步骤3,若未超过,则跳转至步骤704;

步骤703、创建拆分文件,更新写入数据块的文件指针,跳转至步骤701;

步骤704、写入数据块,更新相关信息;

步骤705、写入完成。

实施例2:

本发明的基于动态系统结果数据的快速读方法,包括以下步骤:

步骤1、打开文件,读取文件头,读取索引表中固定表的表名、表的类型、存储布局、表的数据类型、表的行列数和表的数据字节数;可变表的表名、表的类型、存储布局、表的数据类型、表的列数、每一个分块的行数、每一个分块的字节数和是否有兄弟表的标识;

步骤2、根据要读取的变量的引用,读取所述变量在所述索引表中的索引信息;

步骤3、根据所述索引信息,判断所述变量是固定变量还是时变变量,若为固定变量,则跳转到固定变量读取步骤;若为时变变量,则跳转到时变变量读取步骤。

进一步的,所述固定变量读取步骤包括以下步骤:

步骤401、计算数据起始处偏移量;

步骤402、判断偏移量是否超过文件大小,若超过,则报错返回,若未超过,则继续后续步骤;

步骤403、计算实际可读取行数;

步骤404、将文件指针移动到数据起始处;

步骤405、读取单个元素数据;

步骤406、判断数据是否读取完成,若未读取完成,则移动文件指针到读取下一个元素的位置,并且跳转到步骤405;若读取完成,则跳转到步骤407;

步骤407、读取完成。

进一步的,所述时变变量读取步骤包括以下步骤:

步骤501、计算数据起始处偏移量;

步骤502、判断偏移量是否超过文件大小,若超过,则报错返回,若未超过,则继续后续步骤;

步骤503、计算实际可读取行数;

步骤504、将文件指针移动到数据起始处;

步骤505、读取所在分块的数据;

步骤506、判断本文件是否还有后续分块数据,若无,则跳转至步骤509;

步骤507、移动文件指针到下一个分块;

步骤508、判断缓冲区是否读满,若已经读满,则跳转到步骤511,若未读满,则跳转到步骤4;

步骤509、判断是否还有后续拆分文件,若无,则跳转到步骤511,如有,则执行下一步;

步骤510、期望换文件指针到下一个拆分文件,跳转至步骤504;

步骤511、读取完成。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1