一种基于共享内存的数据载入加速方法、装置、电子设备及存储介质与流程

文档序号:23714529发布日期:2021-01-24 05:09阅读:123来源:国知局
一种基于共享内存的数据载入加速方法、装置、电子设备及存储介质与流程

[0001]
本发明属于数据处理技术领域,尤其涉及一种基于共享内存的数据载入加速方法、装置、电子设备及存储介质。


背景技术:

[0002]
进程(process)是计算机中的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,进程包括文本区域(text region)、数据区域(data region)和堆栈区域(stack region),文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
[0003]
进程间通信(ipc,interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话,ipc接口就提供了这种可能性。
[0004]
当前,比较常用的ipc方式有管道、消息队列、信号量、共享内存、信号、套接字、流式处理等。其中,套接字和流式处理支持不同主机上的两个进程ipc,且每个ipc方法都具有各自的优点和局限性。
[0005]
管道(pipe),包括无名管道和有名管道,无名管道(unnamed pipe)是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常是指父子进程关系;有名管道(named pipe)也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
[0006]
消息队列(message queue),是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
[0007]
信号量(semophore),是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
[0008]
信号(sinal),是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
[0009]
套接字(socket),是一种进程间通信机制,与其它通信机制不同的是,它可用于不同进程及不同进程间的通信。
[0010]
流式处理(streams),是一系列数据项,它不是一种数据结构。
[0011]
目前,在我们工作的业务场景下,会遇到这种情况:服务启动需要加载大量数据到
内存,数据规模达数十千兆字节(gb),而数据更新频率较低(周级),使用方式多为静态查询。例如,考题信息查询、此距离欧氏距离的计算数据、分词信息等。而在线服务基于稳定性考虑,通常至少加载双版本数据,服务启动一般需要数十分钟之久。这样就会暴露出很大问题,比如:服务上线旷日持久,人力成本高;需求排队无法快速迭代,时间成本高;加载大量数据,回滚速度慢;故障实例无法快速恢复,造成稳定性隐患;开发测试成本高,数据加载延时,不能并行工作等。


技术实现要素:

[0012]
本发明为了弥补现有技术的不足,提供一种基于共享内存的数据载入加速方法、装置、电子设备及存储介质,本技术方案通过共享内存方式实现不同进程间的数据通讯,既能够在大数据场景下快速启动,又能够加速内存中数据随机存取。共享内存(shared memory)是多进程之间的通信方法,通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。共享内存是映射一段能被其它进程所访问的内存,这段内存由一个进程创建,但多个进程都可以访问。共享内存是最快的ipc方式,是针对其它进程间通信方式运行效率低而专门设计的。共享内存往往与其它通信机制如信号量(semaphore)配合使用,来实现进程间的同步和通信。
[0013]
本发明的实施例是这样实现的:
[0014]
第一方面,本发明实施例提供了一种基于共享内存的数据载入加速方法,应用于服务器,具体实现步骤是:将共享内存用作默认的内存池,在共享内存中创建对象并命名,使用带偏移量的智能指针指向共享内存,导出偏移地址到文件,在共享内存中创建动态数组(vector)和容器(map),构建自定义哈希容器(customized hashmap),加载创建好的内存对象,实现不同进程间的数据通讯。
[0015]
进一步地,将共享内存用作默认的内存池时,可以只分配一部分内存作为共享内存,将消息复制到该共享内存的缓冲区,将共享内存的偏移量发送到另一个进程,完成内存池的创建。
[0016]
进一步地,在共享内存中创建对象,并为其指定一个字符串名称,以便在不再需要这些对象时,其它任何进程都可以在该共享内存中查找到,方便使用、修改和删除。
[0017]
进一步地,将智能指针(offset_ptr)作为地址偏移指针,存储指针本身地址与指向对象地址之间的距离。将offset_ptr放入共享内存,即使该共享内存在不同进程且映射到不同的基址,offset_ptr也可以安全地指向存储在同一共享内存中的对象,且共享内存还可以存储具有指针成员的对象,如在共享内存中创建指针列表。
[0018]
进一步地,将带偏移量的智能指针地址,按照共享内存中指向空间进行导出,并保存到自定义路径的任意文件中,便于其它进程加载使用。
[0019]
进一步地,在共享内存中创建动态数组时,创建一个特殊的托管共享内存,声明一个内存分配器(allocator),在共享内存中构造动态数组(vector)和容器(map),生成自定义哈希容器(customized hashmap),其成员可以包括任何对象。
[0020]
进一步地,自定义哈希容器的数据结构为二维数组,哈希桶不是链表入口,而是记录哈希值指向该哈希桶的键值(key value)数组。
[0021]
进一步地,按照导出的偏移地址文件,导入已写进共享内存指定位置的内存对象,
实现容器的序列化。
[0022]
第二方面,本发明实施例还提供了一种基于数据流向的快速加载方法,应用于服务器,具体实现步骤是:创建共享内存或使用已创建的共享内存,调用已创建/分配的共享内存,传递一个键值作为识别共享内存的标识符,父进程调用共享内存后,创建子进程,将共享内存附加到子进程的地址空间,从已连接的共享内存中分离子进程,传递分离的共享内存地址,对共享内存进行控制,返回一个共享内存信息结构体。
[0023]
进一步地,在调用已创建/分配的共享内存时,系统会设置密钥,指定密钥大小,作为服务器与客户端间运行进程,设置共享内存标志,传递密钥权限,调用共享内存。
[0024]
进一步地,将共享内存附加到子进程的地址空间时,系统会传递参数shmid作为共享内存的标识符,指定共享内存附加地址,指定共享内存标志,将共享内存附加到子进程的地址空间。
[0025]
进一步地,在对共享内存进行控制时,系统会传递参数shmid作为共享内存的标识符,将共享内存中每个成员的当前值复制到指向空间,设置指向空间的id和权限,标记要销毁的内存段,返回指向空间的共享内存限制和参数,返回一个共享内存信息结构体。
[0026]
第三方面,本发明实施例还提供了一种基于词袋、专利、词表和wmd数据的载入加速方法,应用于服务器,具体实现步骤是:加载数据文件,多进程加载stl内存结构,导出数据到共享内存结构,持久化共享内存偏移地址文件,优化载入速度计算,释放stl内存空间。
[0027]
进一步地,在优化载入速度计算过程中,系统会启动计算引擎进程,读取共享内存偏移地址文件,加载共享内存空间,循环计算流程,优化数据载入速度。
[0028]
第四方面,本发明实施例还提供了一种基于共享内存的数据载入加速装置,应用于服务器,该装置包括以下组件:自定义哈希容器(customized hashmap):用于传递一个键值(参数shmid)作为识别共享内存的标识符,将共享内存中每个成员的当前值复制到指向空间,设置指向空间的id和权限,标记要销毁的内存段,返回指向空间的共享内存限制和参数,返回一个共享内存信息结构体;进程地址管理模块:用于指定共享内存附加地址,指定共享内存标志,将共享内存附加到子进程的地址空间,传递分离的共享内存地址,持久化偏移地址文件;共享内存创建模块:用于创建、调用和分配共享内存,设置密钥,指定密钥大小,作为服务器与客户端间运行进程,设置共享内存标志,传递密钥权限,调用共享内存;进程映射模块:用于父进程调用共享内存后,创建子进程,从已连接的共享内存中分离子进程;数据加载计算模块:用于启动计算引擎进程,读取共享内存偏移地址文件,加载共享内存空间,循环计算流程,优化数据载入速度。
[0029]
进一步地,数据加载计算模块可加载的数据包括词袋数据、专利数据、词表数据和wmd数据等。
[0030]
第五方面,本发明实施例还提供了一种电子设备,包括:存储器和处理器,存储器与处理器连接,存储器用于存储程序代码指令,处理器用于调用存储器中存储的程序代码指令,按照获得的程序执行如第一方面到第三方面实施例所提供的方法。
[0031]
第六方面,本发明实施例还提供了一种存储介质,该存储介质存储有处理器可执
行的程序代码指令,存储介质包括多条程序代码指令,多条指令被配置成使处理器执行如第一方面到第三方面实施例所提供的方法。
[0032]
本发明提供的一种基于共享内存的数据载入加速方法、装置、电子设备及存储介质,相比于现有技术具有以下优点:本发明自定义了一套基于共享内存的哈希容器(customized hashmap),在数据静态使用方式的前提下又做了一系列优化,实现了其它数据载入方式不具备、但在实际工程应用时不可或缺的功能,如多类型支持、嵌套容器的实现、内存校验、内存动态管理导入等,并提出了采用记录哈希值到哈希桶的内存存储结构,加快了共享内存容器的插入查找速度。
附图说明
[0033]
图1为实施例一提供的一种基于共享内存的数据载入加速方法的流程图。
[0034]
图2为实施例二提供的一种基于数据流向的快速加载方法的流程图。
[0035]
图3、4为实施例三提供的一种基于词袋、专利、词表和wmd数据的载入加速方法的流程图。
[0036]
图5为实施例四提供的一种基于共享内存的数据载入加速装置的流程图。
[0037]
图6为实施例五提供的一种电子设备的结构示意图。
[0038]
图7为实施例六提供的一种网络系统的交互示意图。
具体实施方式
[0039]
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可以找说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和有点能够更明显易懂,以下为本发明的具体实施方式。实施例一
[0040]
参见图1,为本实施例提供的一种基于共享内存的数据载入加速方法,所举实例只用于解释本发明,并非用于限定本发明的范围。该方法具体包括以下步骤:s101、将共享内存用作默认的内存池;s102、在共享内存中创建对象并命名;s103、使用带偏移量的智能指针指向共享内存;s104、导出偏移地址到文件;s105、在共享内存中创建动态数组(vector)和容器(map),构建自定义哈希容器(customized hashmap);s106、加载创建好的内存对象,实现不同进程间的数据通讯。
[0041]
其中,s101中所述“将共享内存用作默认的内存池”是指:可以只分配一部分内存作为共享内存,将消息复制到该共享内存的缓冲区,将共享内存的偏移量发送到另一个进程,完成内存池的创建。
[0042]
其中,s102中所述“在共享内存中创建对象并命名”是指:在共享内存中创建对象,并为其指定一个字符串名称,以便在不再需要这些对象时,其它任何进程都可以在该共享内存中查找到,方便使用、修改和删除。
[0043]
其中,s103中所述“使用带偏移量的智能指针指向共享内存”是指:将智能指针
(offset_ptr)作为地址偏移指针,存储指针本身地址与指向对象地址之间的距离,将带偏移量的智能指针放入共享内存;共享内存即使不在同一进程且映射到不同的基址,智能指针也能安全地指向存储在同一共享内存中的对象。所述“共享内存”还可以存储具有指针成员的对象,如在共享内存中创建指针列表。
[0044]
其中,s104中所述“导出偏移地址到文件”是指:将带偏移量的智能指针地址,按照共享内存中指向空间进行导出,并保存到自定义路径的任意文件中,便于其它进程加载使用。
[0045]
其中,s105进一步包括:s1051、创建一个特殊的托管共享内存;s1052、声明一个内存分配器(allocator);s1053、在共享内存中构造动态数组(vector)和容器(map),其成员可以包括任何对象;s1054、构建自定义哈希容器(customized hashmap)。
[0046]
其中,s1053中所述“动态数组(vector)”的数据结构为二维数组,哈希桶不是链表入口,而是记录哈希值指向该哈希桶的键值(key value)数组。
[0047]
其中,s106中所述“加载创建好的内存对象”是指:按照导出的偏移地址文件,导入已写进共享内存指定位置的内存对象,实现容器的序列化。
[0048]
其中,本实施例所述方法是应用于实施例五中所述电子设备200的解调方法。实施例二
[0049]
参见图2,为本实施例提供的一种基于数据流向的快速加载方法,所举实例只用于解释本发明,并非用于限定本发明的范围。该方法具体包括以下步骤:s201、创建共享内存或使用已创建的共享内存;s202、调用已创建/分配的共享内存,传递一个键值作为识别共享内存的标识符;s203、父进程调用共享内存后,创建子进程;s204、将共享内存附加到子进程的地址空间;s205、从已连接的共享内存中分离子进程,传递分离的共享内存地址;s206、对共享内存进行控制,返回一个共享内存信息结构体。
[0050]
其中,s202中所述键值可以是任意值,也可以是从库函数派生的值,s202进一步包括:s2021、设置密钥,指定密钥大小,作为服务器与客户端间运行进程;s2022、设置共享内存标志;s2023、传递密钥权限,调用共享内存。
[0051]
其中,s2021中所述“密钥”可以是私有密钥,所述“密钥大小”等于共享内存的大小,四舍五入后是页面大小的倍数,所述“服务器与客户端间运行进程”是父子关系的相互关联的进程间通信(ipc)。
[0052]
其中,s2022中所述“设置共享内存标志”是指:创建新内存段或定义为ipc_exec,与ipc_creat一起使用以创建新内存段,如果内存段已经存在,则调用失败。
[0053]
其中,s2023中所述“密钥权限”是指:只有客户端的运行进程是服务器的子进程,才可通过密钥调用共享内存。
[0054]
其中,s204进一步包括:
s2041、传递参数shmid作为共享内存的标识符;s2042、指定共享内存附加地址;s2043、指定共享内存标志;s2044、将共享内存附加到子进程的地址空间。
[0055]
其中,s2041中所述“参数shmid”是系统调用的返回值。
[0056]
其中,s2042中所述“共享内存附加地址”如果设置为空,则系统默认选择合适的地址来附加内存段;如果设置为非空,则附加内存段等于低边界地址的最接近倍数的地址。否则,共享内存附加地址必须是页面对齐的地址,共享内存加载将在该地址处启动。
[0057]
其中,s2043中所述“指定共享内存标志”是指:将地址四舍五入或将现有映射替换为共享内存地址指定的范围,并一直持续到内存段末尾,如果成功,此调用将返回连接的共享内存地址;如果失败,则返回-1。
[0058]
其中,s205中所述“分离的共享内存地址”是系统调用的返回地址。
[0059]
其中,s206进一步包括:s2061、传递参数shmid作为共享内存的标识符;s2062、将共享内存中每个成员的当前值复制到指向空间;s2063、设置指向空间的id和权限;s2064、标记要销毁的内存段;s2065、返回指向空间的共享内存限制和参数;s2066、返回一个共享内存信息结构体。
[0060]
其中,s2062中所述“复制”过程需要对共享内存具有读取权限。
[0061]
其中,s2063中所述“id和权限”包括用户id、所有者的组id和权限等。
[0062]
其中,s2064中所述“销毁”过程只有在最终将其分离后,该内存段才被销毁。
[0063]
其中,s2066中所述“共享内存信息结构体”包含有关共享内存消耗的系统资源的信息。
[0064]
本实施例是针对低频更新、静态使用、大规模数据的快速加载方案,可以高效托管大规模静态数据,加速大内存服务冷启动和热加载。数据文件大概在2000万行数量级以上,采用多进程加载方式,在64核cpu和512gb内存的服务器中,加载时间大概15min;采用共享内存方式优化后,可以在几秒内快速启动应用程序,内存占用率大概26.4%。评测数据如下表:
benchmark(1000w)<int64,int32>random find(μs)tranversal(μs)memory(kb)stl unordered map95367442087452834stl map13015819219995626320boost interprocess map17479234425679468970customized hashmap67890815652243998
数据结构采用整型int32作为键值来构造容器(map),容器内数据大小为1000万条,用无序关联容器(stl unordered_map)、关联容器(stl map)、增强进程间容器(boost interprocess map)与本实施例构建的自定义哈希容器(customized hashmap)进行比较,分别对随机查找时间(random find)、遍历时间(tranversal)和内存占用大小(memory)三项指标进行测试,可以看出:customized hashmap随机查找和遍历的时间最短(微秒级),内
存占用最低,三项指标均处于领先地位。
[0065]
通过上述基线测试表明,自定义哈希容器的查询性能较标准容器持平且略有提升,内存使用效率优势明显,与无序关联容器相比,查找和遍历性能更胜一筹,具有更佳的数据局部性,且哈希桶为二维数组结构,较链表节省指针域空间,具有更高的空间使用效率;相比于红黑树实现的容器(map),自定义哈希容器和无序关联容器的查找时间复杂度低,性能优势明显,而红黑树实现的容器其空间使用率较低,原因是红黑树节点包含更多的指针域(left/right/parent)、颜色标记字段等。
[0066]
其中,本实施例所述方法是按照实施例一中所述方法通过执行程序代码完成数据载入加速。实施例三
[0067]
参见图3、4,为本实施例提供的一种基于词袋、专利、词表和wmd数据的载入加速方法,所举实例只用于解释本发明,并非用于限定本发明的范围。该方法具体包括以下步骤:s301、启动进程,加载数据文件;s302、多进程加载stl内存结构;s303、导出数据到共享内存结构;s304、持久化共享内存偏移地址文件;s305、优化载入速度计算;s306、释放stl内存空间,结束进程。
[0068]
其中,s301中所述“数据文件”包括词袋数据文件、专利数据文件、词表数据文件和wmd余弦距离文件。
[0069]
其中,s302中所述“stl内存结构”包括词袋数据stl内存结构、专利数据stl内存结构、词表数据stl内存结构和wmd数据stl内存结构。
[0070]
其中,s303中所述“共享内存结构”包括词袋数据共享内存结构、专利数据共享内存结构、词表数据共享内存结构和wmd数据共享内存结构。
[0071]
其中,s304中所述“偏移地址文件”包括词袋数据偏移地址文件、专利数据偏移地址文件、词表数据偏移地址文件和wmd数据偏移地址文件。
[0072]
其中,s305进一步包括:s3051、启动计算引擎进程,读取共享内存偏移地址文件;s3052、加载共享内存空间;s3053、循环计算流程;s3054、优化数据载入速度,结束计算引擎进程。
[0073]
其中,s3051中所述“偏移地址文件”包括词袋数据偏移地址文件、专利数据偏移地址文件、词表数据偏移地址文件和wmd数据偏移地址文件。
[0074]
其中,s3052中所述“共享内存空间”包括词袋数据共享内存空间、专利数据共享内存空间、词表数据共享内存空间和wmd数据共享内存空间。
[0075]
其中,本实施例所述方法是按照实施例一、实施例二中所述方法通过执行程序代码完成数据载入加速。实施例四
[0076]
参见图5,为本实施例提供的一种基于共享内存的数据载入加速装置210,所举实
例只用于解释本发明,并非用于限定本发明的范围。该装置具体包括以下组件:共享内存创建模块211:用于创建、调用和分配共享内存,设置密钥,指定密钥大小,作为服务器与客户端间运行进程,设置共享内存标志,传递密钥权限,调用共享内存;进程地址管理模块212:用于指定共享内存附加地址,指定共享内存标志,将共享内存附加到子进程的地址空间,传递分离的共享内存地址,持久化偏移地址文件;进程映射模块213:用于父进程调用共享内存后,创建子进程,从已连接的共享内存中分离子进程;数据加载计算模块214:用于启动计算引擎进程,读取共享内存偏移地址文件,加载共享内存空间,循环计算流程,优化数据载入速度;自定义哈希容器(customized hashmap)215:用于传递一个键值(参数shmid)作为识别共享内存的标识符,将共享内存中每个成员的当前值复制到指向空间,设置指向空间的id和权限,标记要销毁的内存段,返回指向空间的共享内存限制和参数,返回一个共享内存信息结构体。
[0077]
其中,数据加载计算模块214可加载的数据包括词袋数据、专利数据、词表数据和wmd数据等。
[0078]
其中,本实施例所述数据载入加速装置210,其实现原理及产生的技术效果与实施例一、实施例二和实施例三中各所述方法相同,为简要描述,本实施例中未提及之处,可参考前述方法实施例中相应内容。实施例五
[0079]
参见图6,为本实施例提供的一种电子设备200,所举实例只用于解释本发明,并非用于限定本发明的范围。所述电子设备200包括:数据载入加速装置210、存储器220和处理器230。
[0080]
其中,所述数据载入加速装置210、存储器220、处理器230各元件相互之间直接或间接地电性连接,以实现数据的传输或交互。
[0081]
其中,上述各元件相互之间可通过一条或多条通讯总线或信号线实现电性连接。所述数据载入加速装置210包括至少一个可以软件或固件(firmware)的形式存储于所述存储器220中或固化在所述电子设备200的操作系统(0s)中的软件功能模块。所述处理器230用于执行所述存储器220中存储的可执行模块,比如,所述数据载入加速装置210包括的软件功能模块或计算机程序。
[0082]
其中,所述存储器220不限于随机存取存储器(ram),只读存储器(rom),可编程只读存储器(prom),可擦除只读存储器(eprom),电可擦除只读存储器(eeprom)等。
[0083]
其中,所述存储器220用于存储程序,所述处理器230在接收到执行指令后,执行所述程序。本发明实施例一、实施例二和实施例三中所执行的方法均可以应用于本实施例所述电子设备200的处理器230中,或者由处理器230实现。
[0084]
其中,所述处理器230可能是一种集成电路芯片,具有信号的处理能力。所述处理器230可以是通用处理器,包括中央处理器(cpu)、网络处理器(np)等;还可以是数字信号处理器(dsp)、专用集成电路(asic)、现成可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器,或者也可以是任何常规的处理器等。
[0085]
其中,本实施例所述电子设备200可以是实施例六中所述服务器110。实施例六
[0086]
参见图7,为本实施例提供的一种网络系统100,所举实例只用于解释本发明,并非用于限定本发明的范围。所述网络系统100包括:服务器110和客户终端120,客户终端120通过网络与服务器110进行数据交互。
[0087]
其中,所述服务器110在数据载入加速时,将预设提示信息发送至与所述服务器110通信的客户终端120。
[0088]
其中,所述服务器110不限于网络服务器、数据库服务器、云端服务器等。所述客户终端120不限于个人电脑(pc)、智能手机、平板电脑、移动上网设备(mid)、个人数字助理(pda)等电子设备。
[0089]
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。并且,各个实施例公开并不局限于上面已经描述并在附图中示出的精确结构,还可以在不脱离其范围进行各种修改和改变。
[0090]
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围不局限于此,任何熟悉本技术领域的技术人员在本发明的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1