一种基于DSS数据***快速加载大型数据群的方法
技术领域
本发明涉及一种基于DSS数据***快速加载大型数据群的方法。
背景技术
Darwin Streaming Server简称DSS。DSS是Apple公司提供的开源实时流媒体播放服务器程序,整个程序使用纯粹C++编写,在设计上遵循高性能、简单、模块化等程序设计原则,务求做到程序高效,可扩充性好,因此DSS服务器***在跨平台的支持上是相当理想的,它可以运行在Windows NT、Windows 2000及以上的windows内核版本,同时也能良好的运行在*NIX的各种版本上,包括Mac OS X,Linux,FreeBSD,Solaris,同时DSS基于标准的流媒体协议RTSP,RTP/RTCP进行开发,因此在运用上具有极强的广泛性和通用性。
目前基于DSS服务器数据***存在以下缺陷:
一、传统IT业务部署上的“烟囱式”架构导致设备硬件的高配低用,考虑到未来运用***业务发展,以及业务突发的需求,为满足应用程序的性能,容量承载需求,用户往往选择在计算、存储和网络等硬件设备的配置时会留有一定比例的余量,但硬件资源上线后,应用***在一定时间内的负载并不会太高,这就使得较高配置的硬件设备利用率不高。
二、现有DSS服务器数据***在对数据进行存储,交换上以堆为主要手段,在这种情况下如果数据量较小,对数据使用不太频繁的情况下影响不大,然而对于企业商用级服务器而言,往往需要加载大批量数据以及频繁对大型数据群进行操作,如果使用原有的堆操作方式那么每次都要去开辟、释放空间,而且开辟的空间非常庞大,并且在运行过程中会产生大量的内存碎片,使得内存使用上空间和时间效率都非常低下,程序运行一段时间后会变质。
三、现有DSS服务器并没有锁定内存页面,服务器往往具有非常大的内存容量并且独占运用,而实际运行过程中真正的物理内存使用却非常低下,在操作大型数据群的时候频繁产生缺页中断,而缺页中断的产生将非常严重影响服务器的响应速度进而堆积数据接入,最终甚至将导致服务器宕机,而这种问题往往很难排查。
四、大型数据群的I/O,现有基于DSS框架的运用上对于大量数据从数据库中进行读写往往使用小批量,需要时加载的方式,这种方式的使用局限性非常大,而且对于频繁的I/O操作在服务器使用上更是无法接受的消耗。
有鉴于此,本发明人提出一种基于DSS数据***快速加载大型数据群的方法。
发明内容
本发明的一个目的在于提供一种基于DSS数据***快速加载大型数据群的方法,以充分利用服务器物理内存资源、实现大型数据群的快速加载和高效实用,提高DSS框架数据***效率。
为了实现上述目的,本发明的技术方案如下:
一种基于DSS数据***快速加载大型数据群的方法,包括以下步骤:
步骤1、设计专用虚拟内存类QTSSVMArray,该虚拟内存类为模板类,类中包含用于初始化的时候事先预留设定量的空间的构造函数,所述空间并不在物理内存中;
步骤2、将虚拟内存模板类QTSSVMArray作为DSS原数据***中QTSSDictionary的静态成员变量,再根据应用程序的需要设计存储空间中要存放的结构体类型;
步骤3、在QTSSDictionary初始化QTSSVMArray这个静态成员变量,预留10MB地址空间,如果在该阶段DSS服务器预留空间失败,则重启DSS数据服务器;
步骤4、在QTSSDictionary中新增函数SetBigValue以及qtssAttrDataTypeBigData标志,函数SetBigValue用于设置存储大型数据结构,qtssAttrDataTypeBigData标志则用于设置***数据类型中新增大型结构数据类型,在所述函数SetBigValue被第一次调用时将实际提交物理存储器,根据需要提交1MB实际物理内存给之前预留的地址空间;所述SetBigValue函数中使用指针来进行数据存储,在函数中对qtssAttrDataTypeBigData标志中的fAllocatedLen长度设置为指针数组的长度,fAttributeData.Ptr为指针数组的地址,fAttributeData.Len为指针sizeof的值;
步骤5、服务器启动过程将通过数据库插件加载数据库中的庞大数据群进入服务器进程内存空间,在数据库插件中设计对于每一行数据调用一次SetBigValue函数,将每行数据存放进虚拟内存中的每一个结构体中,此时SetBigValue函数将根据开辟出来的指针数组中的数组下标对应一块实际物理内存结构,及指针数组中的每根指针分别对应提交给虚拟内存物理空间中的一块内存区进行数据存放。
步骤6、在DSS数据***的GetValuePtr函数中增加对新增的qtssAttrDataTypeBigData属性值获取的条件,其中对于新增虚拟内存物理空间的地址获取方式和使用堆空间的获取方式相同;
步骤7、在服务器使用过程中对提交的物理内存进行锁定。
步骤8、新增QTSS_SetBigValue接口,以提供给服务器外部插件使用;
步骤9、在QTSSVMArray类中虚构函数,以使虚拟内存生命周期的最后进行释放。
所述步骤1还包括:设置MEM_TOP_DOWN标志于虚拟函数VirtualAlloc,使操作***从高位内存地址开始预留空间。
所述步骤2中,可根据实际需要将存储空间存放的结构类型设计成每个结构体大小为1024Bytes的结构体类型,且设计结构体类型为目标***分页文件大小的倍数,这个值在X86,X64上为4KB,在IA64上为8KB。
采用上述方案后,本发明与现有技术相比有益效果在于:
(1)通过开辟大型虚拟内存并且提交大量物理存储器给服务器使用,充分利用了服务器硬件资源,而现有方法在服务器资源使用上大量闲置。
(2)通过虚拟内存的使用,可以充分使用虚拟内存特点:
1)对大型数据群的加载变成可能;
2)内存开辟一次完成,相比于现有***需要每次开辟,效率明显提升;
3)通过虚拟内存空间连续的特点,访问数据方便快捷,现有方案堆开辟方式在物理内存空间中地址不连续,链表式访问低效并且容易造成大量内存碎片。
(3)通过锁定物理内存最大限度防止服务器进程空间在运行期发生内存页交换,极大降低服务器性能损耗,现有方法在大型数据群使用过程中将频繁***作***内存管理器进行页面换入换出调度,极大影响服务器性能;
(4)通过虚拟内存的使用实现一次性加载大型数据群,避免了现有方案上需要再加载的情况,特别对于需要I/O过程的数据加载情况在服务器上是将造成宕机的举动。
以下结合附图和具体实施方式对本发明做进一步说明。
附图说明
图1:本发明DSS的高效数据***设计方法流程图。
具体实施方式
如图1所示,本发明揭示的一种基于DSS数据***快速加载大型数据群的方法,包括以下步骤:
步骤1、设计专用虚拟内存类QTSSVMArray,该虚拟内存类为模板类,类中包含用于初始化的时候事先预留设定量的空间的构造函数,空间并不在物理内存中;设置MEM_TOP_DOWN标志于虚拟函数VirtualAlloc,使操作***从高位内存地址开始预留空间;
步骤2、将虚拟内存模板类QTSSVMArray作为DSS原数据***中QTSSDictionary的静态成员变量,再根据应用程序的需要设计存储空间中要存放的结构体类型;可根据实际需要将存储空间存放的结构类型设计成每个结构体大小为1024Bytes的结构体类型,且设计结构体类型为目标***分页文件大小的倍数,这个值在X86,X64上为4KB,在IA64上为8KB;
步骤3、在QTSSDictionary初始化QTSSVMArray这个静态成员变量,预留10MB地址空间,如果在该阶段DSS服务器预留空间失败,则重启DSS数据服务器;
步骤4、在QTSSDictionary中新增函数SetBigValue以及qtssAttrDataTypeBigData标志,函数SetBigValue用于设置存储大型数据结构,qtssAttrDataTypeBigData标志则用于设置***数据类型中新增大型结构数据类型,在所述函数SetBigValue被第一次调用时将实际提交物理存储器,在本文中根据需要提交1MB实际物理内存给之前预留的地址空间;所述SetBigValue函数中使用指针来进行数据存储,在函数中对qtssAttrDataTypeBigData标志中的fAllocatedLen长度设置为指针数组的长度,fAttributeData.Ptr为指针数组的地址,fAttributeData.Len为指针sizeof的值;
步骤5、服务器启动过程将通过数据库插件加载数据库中的庞大数据群进入服务器进程内存空间,在数据库插件中设计对于每一行数据调用一次SetBigValue函数,将每行数据存放进虚拟内存中的每一个结构体中,此时SetBigValue函数将根据开辟出来的指针数组中的数组下标对应一块实际物理内存结构,及指针数组中的每根指针分别对应提交给虚拟内存物理空间中的一块内存区进行数据存放;此步骤中要根据实际程序读取的数据库中的数据大小以及规模情况进行分配。
步骤6、在DSS数据***的GetValuePtr函数中增加对新增的qtssAttrDataTypeBigData属性值获取的条件,其中对于新增虚拟内存物理空间的地址获取方式和使用堆空间的获取方式地方相同;
步骤7、在服务器使用过程中对提交的物理内存进行锁定,以防止其发生分页交换的情况。
步骤8、新增QTSS_SetBigValue接口,以提供给服务器外部插件使用;
步骤9、在QTSSVMArray类中虚构函数,以使虚拟内存生命周期的最后进行释放。
以上仅为本发明的具体实施例,并非对本发明的保护范围的限定。凡依本案的设计思路所做的等同变化,均落入本案的保护范围。