一种口腔扫描应用中的内存池实现方法技术

技术编号:38271442 阅读:11 留言:0更新日期:2023-07-27 10:25
本发明专利技术涉及一种口腔扫描应用中的内存池实现方法,其包括:口扫设备扫描口腔以获取口腔图像并通过口腔图像的图像信息重建出3D点云;将3D点云按照其特征拼接形成完整的统一坐标系下3D点云并由3D点云生成3D网格;采用随机内存大小的申请方法来对口腔图像进行内存申请;采用固定内存大小的申请方法来对3D点云和3D网格进行内存申请。本申请将尽可能的去掉加锁的限制提高程序的运行效率。此外,本申请采用的内存池分配方法,在一定程度上降低了碎片的产生节约了碎片合并的时间。的产生节约了碎片合并的时间。的产生节约了碎片合并的时间。

【技术实现步骤摘要】
一种口腔扫描应用中的内存池实现方法


[0001]本专利技术涉及口腔扫描和内存池领域,具体为一种口腔扫描应用中的内存池实现方法。

技术介绍

[0002]在三维扫描设备领域中,扫描设备的工作流程如下:通过获取2D图像信息重建出3D点云,并将3D点云按照其特征拼接起来形成完整的统一坐标系下点云,最后由3D点云生成3D网格,完成现实物体的3D数字化。
[0003]整个扫描扫描的过程中,大量的数据处理以及数据的频繁相似处理,会产生大量的内存的碎片。目前已知的第三方内存池的实现原理基本上是从系统申请大量的内存,为当前进程持有,并将这申请的整块内存进行不同字节类型的分类,建立索引以供上层应用调用。只有当前进程退出时,内存池的内存才会归还操作系统。
[0004]这些内存池的实现策略复杂,其目的是为了满足不同的应用开发。对三维扫描设备领域的软件以及算法的支持不够精准,不能够做到量身定做。随着并发处理和业务处理的积累,内存使用逐步增大并细化,内存池中的内存也会逐渐碎片化,可用的大块内存会越来越少,在一些极端的情况下,由于大量的碎片化,即使内存总空闲量远远大于单次申请量,也无法满足实际需求进而导致内存申请失败。
[0005]根据三维扫描设备领域的实时扫描的特点,本方法提供一种实现简单,效率较高的内存池的实现方法多线程的内存申请往往在内存池中通过加锁实现安全,但口扫实时处理对速度有较高要求,大量使用锁会导致效率的下降。因此我们提供一种简单的适合口扫项目的高效内存池实现方法。

技术实现思路

[0006]针对现有技术的不足,本专利技术提供了一种口腔扫描应用中的内存池实现方法,其包括:用户选择一种内存池方法,并判断所述内存池方法是否以字节为单位处理;
[0007]若是,则采用随机内存大小的申请方法申请内存;
[0008]若否,则采用固定内存大小的申请方法申请内存;
[0009]所述随机内存大小的申请方法具体包括以下步骤:
[0010]用户在计算机可用内存大小范围内指定申请内存大小,并在计算机可用内存大小范围内查找闲置内存;
[0011]判断在计算机可用内存大小范围内是否存在与指定申请内存大小相同的闲置内存;
[0012]若是,则将相应内存返回给用户;
[0013]若否,则向操作系统申请内存;
[0014]判断内存申请是否成功;
[0015]若是,则将相应内存返回给用户;
[0016]若否,则退出程序。
[0017]根据一个优选的实施例,口扫设备扫描口腔以获取口腔图像,并通过口腔图像的图像信息重建出3D点云;
[0018]将3D点云按照其特征拼接形成完整的统一坐标系下3D点云,并由3D点云生成3D网格;
[0019]采用随机内存大小的申请方法来对口腔图像进行内存申请;采用固定内存大小的申请方法来对3D点云和3D网格进行内存申请。
[0020]根据一个优选的实施例,所述固定内存大小的申请方法具体包括以下步骤:
[0021]编译时指定每次申请的内存池对象的对象类型Obj和对象数量N;
[0022]内存池对象检查自身剩余的内存大小是否大于一个对象的内存大小sizeof(Obj);
[0023]若是,则将相应内存返回给用户;
[0024]若否,则以N*sizeof(Obj)大小向操作系统申请内存;
[0025]判断内存申请是否成功;
[0026]若是,则记录申请到的内存,并将相应内存返回给用户;
[0027]若否,则退出程序。
[0028]根据一个优选的实施例,在口扫设备扫描口腔过程中,口腔图片的大小是固定不变的(M
×
L);口腔图片每个像素用n个字节来表示;每幅口腔图片的大小M
×
L
×
n个字节。
[0029]根据一个优选的实施例,在用户申请内存之前,随机存储器中没有任何可用内存;
[0030]在用户申请内存时,随机存储器向操作系统申请一个M
×
L
×
n字节大小的内存m_1,并进行加锁处理以保证线程安全,然后将m_1记录在listAllTrunks列表中;
[0031]用户不断申请若干个内存,m_2、m_3......m_k,并将这些内存记录在listAllTrunks列表中;其中,m_k为第k次申请内存得到的内存;
[0032]当用户处理完一幅图片后,在释放内存m_k时,随机存储器会根据m_k的大小检查闲置内存的Map,如果在闲置内存中找不到m_k的大小内存块则直接将m_k插入闲置内存中。
[0033]根据一个优选的实施例,在用户再次申请一个M
×
L
×
n个字节的内存块时,
[0034]随机存储器会首先在闲置内存中查找M
×
L
×
n个字节的内存块;
[0035]若找到,则将找到的第一个内存块从闲置内存中去掉,并将所述内存块返回给用户;
[0036]若找不到,则向操作系统申请内存;这一步进行了加锁处理,保证线程安全。
[0037]程序退出时,随机存储器释放listAllTrunks中的所有内存。
[0038]根据一个优选的实施例,在用户申请内存前,用户预先申请一个内存池对象的大小空间,此时内存池对象没有任何内存;
[0039]内存池对象向操作系统一次性申请N
×
sizeof(Obj)大小的内存m_0;
[0040]将内存m_0存放在listTrunk中,并把内存m_0中的第一个sizeof(Obj)大小的内存空间返回给用户;
[0041]随着用户不断的申请内存,内存池对象将预先申请的内存空间不断返回给用户直到内存池对象中的内存空间被用完;
[0042]内存池对象重新申请N
×
sizeof(Obj)大小的内存m_1,并将内存m_1存放在
listTrunk中。
[0043]根据一个优选的实施例,内存池对象是用户创建,其生命周期由用户决定;当内存池对象被销毁时,ListTrunck中的内存会被释放。
[0044]根据一个优选的实施例,在多线程中,需要多个内存池对象来进行内存申请。
[0045]与现有技术相比,本专利技术提供了一种口腔扫描应用中的内存池实现方法,具备以下有益效果:
[0046]为了实现线程安全,在很多地方申请内存时需要加锁,但加锁会降低程序的运行效率。本申请内存池实现,将尽可能的去掉加锁的限制提高程序的运行效率。
[0047]为了解决在长时间运行或者频繁申请释放内存时产生很多内存锁片,大部分采用将零星碎片进行合并的策略,而本申请采用的内存池分配方法,在一定程度上降低了碎片的产生(固定内存的申请和释放),对RandMemory主要是用于图片(固定大小)的处理,节约了碎片合并的时间。
附图说明
[0048]图1为本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种口腔扫描应用中的内存池实现方法,其特征在于,包括以下步骤:用户选择一种内存池方法,并判断所述内存池方法是否以字节为单位处理;若是,则采用随机内存大小的申请方法申请内存;若否,则采用固定内存大小的申请方法申请内存;所述随机内存大小的申请方法具体包括以下步骤:用户在计算机可用内存大小范围内指定申请内存大小,并在计算机可用内存大小范围内查找闲置内存;判断在计算机可用内存大小范围内是否存在与指定申请内存大小相同的闲置内存;若是,则将相应内存返回给用户;若否,则向操作系统申请内存;判断内存申请是否成功;若是,则将相应内存返回给用户;若否,则退出程序。2.根据权利要求1所述的方法,其特征在于,口扫设备扫描口腔以获取口腔图像,并通过口腔图像的图像信息重建出3D点云;将3D点云按照其特征拼接形成完整的统一坐标系下3D点云,并由3D点云生成3D网格;采用随机内存大小的申请方法来对口腔图像进行内存申请;采用固定内存大小的申请方法来对3D点云和3D网格进行内存申请。3.根据权利要求2所述的方法,其特征在于,所述固定内存大小的申请方法具体包括以下步骤:编译时指定每次申请的内存池对象的对象类型Obj和对象数量N;内存池对象检查自身剩余的内存大小是否大于一个对象的内存大小sizeof(Obj);若是,则将相应内存返回给用户;若否,则以N*sizeof(Obj)大小向操作系统申请内存;判断内存申请是否成功;若是,则记录申请到的内存,并将相应内存返回给用户;若否,则退出程序。4.根据权利要求2所述的方法,其特征在于,在口扫设备扫描口腔过程中,口腔图片的大小是固定不变的(M
×
L);口腔图片每个像素用n个字节来表示;每幅口腔图片的大小M
×
L
×
n个字节。5.根据权利要求4所述的方法,其特征在于,在用户申请内存之前,随机存储器中没有任何可用内存;在用户申请内存时,随机存储器向操作系统申请一个M
×
L

【专利技术属性】
技术研发人员:孙军张佰春吕广志
申请(专利权)人:深圳市菲森科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1