基于内存预分配和多点并写技术的大规模点云数据快速读取方法

文档序号:6628592阅读:737来源:国知局
基于内存预分配和多点并写技术的大规模点云数据快速读取方法
【专利摘要】基于内存预分配和多点并写技术的大规模点云数据快速读取方法,属于点云数据文件读取【技术领域】。本发明为了解决现有的高大规模点云数据文件读取时间延迟、读取速度慢的问题。所述方法包括:内存预分配过程和多点并写过程,首先确定点云数据文件中点的数目,确定点云数据文件中所有点需要占用的内存大小,预先为点云数据分配对应大小的内存;通过内存映射文件机制,将点云数据文件映射到映射内存后创建含有指定数量线程的线程池,每个线程负责解析映射内存中的部分点数据信息,并将解析结果写入到之前预先分配的内存中实现多点并写。测试结果表明,基于内存预分配和多点并写技术的读取方法使点云数据文件特别是大规模点云数据文件的读取速度提高220%~300%。
【专利说明】基于内存预分配和多点并写技术的大规模点云数据快速读取方法

【技术领域】
[0001]本发明涉及一种大规模点云数据快速读取方法,属于点云数据文件读取【技术领域】。

【背景技术】
[0002]随着反求工程技术的发展,三维扫描设备在扫描规模和性能上都有很大提高,一方面可以非常容易地采集表达物体表面形状的三维点云数据,另一方面需要处理的点云数据规模则呈几何级方式增长。根据不同的应用场合,点云数据的处理规模可从几百个点到上千万个点,甚至可以达到数亿点的级别。
[0003]狭义的大规模点云数据的概念是宏观上点的数量规模非常大,如数千万,甚至数亿;而广义的大规模点云数据的概念则与处理点云数据的系统内存有关,相比于具有数TB甚至更大内存的超级计算机系统,处理数亿的点云数据并不会显得十分困难,而相比于仅有数十MB甚至更小内存的计算机系统,处理数万甚至更少的点云数据都很费力。
[0004]应用程序在真正地处理点云数据之前首先要将点云数据从外部硬盘文件加载到内存中。当读取的点云数据文件规模比较小(几百个点到数十万个点)时,用户一般感觉不到明显的时间延迟,不会影响用户对应用程序的体验。但是,当点云数据文件的规模达到数百万,特别是数千万甚至数亿级别时,读取文件的时间延迟将会明显甚至严重影响用户体验。目前,通过调研相关文献发现,现有的点云数据文件读取方法存在以下问题:
[0005]I)每一个所读取的点数据的保存导致内存的动态分配。由于点云文件中所包含的点数量巨大,频繁的内存动态分配将严重影响应用程序的性能。C++标准库中的vector类是此种应用的典型代表。
[0006]2)读取点云数据文件的操作顺序化。由于传统的文件操作均以文件句柄为基础,这限制了点云数据文件的读取方式必须以顺序化的形式完成,无法充分发挥CPU的多核并行能力。
[0007]以上两个方面的问题严重影响了以点云数据特别是大规模点云数据处理为目的的软件性能。


【发明内容】

[0008]本发明的目的是提供一种基于内存预分配和多点并写技术的大规模点云数据快速读取方法,以解决现有的高大规模点云数据文件读取时间延迟、读取速度(加载速度慢)的问题。
[0009]本发明为解决上述技术问题采取的技术方案是:
[0010]步骤A、内存预分配过程:首先确定点云数据文件中点的数目,从而确定点云数据文件中所有点需要占用的内存大小,然后预先为点云数据分配对应大小的内存;
[0011]步骤B、多点并写过程:通过内存映射文件机制,将点云数据文件映射到映射内存后创建含有指定数量线程的线程池,每个线程负责解析映射内存中的部分点数据信息,并将解析结果写入到之前预先分配的内存中,实现多点并写。
[0012]步骤A是基于内存预分配技术原理
[0013]内存预分配技术要解决的问题就是在读取大规模点云数据文件过程中,避免保存点数据所产生的频繁的内存分配操作。点的三个坐标值具有相同的数据类型,因此每个点占用内存的大小一定。在这种前提下,只要确定了点云数据文件中点的数目,即可以准确的确定点云数据文件中所有点需要占用的内存大小,因而可以提前为点云数据分配好内存,避免了动态内存分配导致的性能问题,达到了内存预分配技术的目的。经过测试,本发明方法采用数据分块方式确定点云数据文件中的点数目,与其它方法相比较的结果如图1所
/Jn ο
[0014]步骤B是基于多点并写技术原理
[0015]多点并写技术的核心思想是借助于内存映射文件机制,将对文件进行的1操作由传统的顺序化方式改为由并行化方式完成。基本过程是将点云数据文件映射到内存后创建含有指定数量线程的线程池,每个线程负责解析映射内存中的部分点数据信息,并将解析结果写入到之前预先分配的内存中。如果不同地址处的内存读写具有并行性,因此多个线程同时解析并写入的操作并不会发生冲突,这将显著提高点云数据文件的加载速度,如图2所示。
[0016]本发明的有益效果是:
[0017]本发明提出并实现了 windows平台下基于线程池和内存映射文件的内存预分配技术和多点并写技术,显著提高了大规模点云数据文件的读取速度。本发明方法采用数据分块方式确定点云数据文件中的点数目与现有其它方法相比较,读取时间远远小于现有方法,如图1所示。对不同的点云数据文件读取方法进行了测试和比较,结果如图4所示。测试结果表明,基于内存预分配和多点并写技术的读取方法,可使点云数据文件特别是大规模点云数据文件的读取速度提高220%?300%,而且随着点云数据文件规模的增长,本发明所述读取方法所用的读取时间增长较其它方法最低。从图4看出,本发明方法相对现有的高大规模点云数据文件读取速度有显著的提高,相对于现有技术有了质的变化,极大提闻了用户体验。
[0018]本发明方法的使用将充分发挥多核CPU的并行计算优势,使传统的基于文件句柄的串行读取模式改为基于内存映射文件的并行读取模式,并结合根据点云文件中点的数量预先分配对应大小的内存,以达到显著提高大规模点云数据文件的加载速度。本发明方法也可应用在其它类型的以文件读取为瓶颈的领域。

【专利附图】

【附图说明】
[0019]图1为本发明方法采用数据分块方式确定点云数据文件中的点数目与其它方法相比较的结果图,图1中,横坐标为点云数据文件中点数目,纵坐标为读取时间,其单位为毫秒;图2为本发明所述的多点并写技术原理示意图;图3本发明方法流程框图;图4为本发明方法与其它方法性能比较曲线图(读取速度的比较图),图4中:横坐标为读取的点云数据的大小,其单位为M,纵坐标为读取时间,其单位为毫秒。

【具体实施方式】
[0020]【具体实施方式】一:如图2和3所不,本实施方式所述的一种基于内存预分配和多点并写技术的大规模点云数据快速读取方法,其特征在于,所述方法为:
[0021]步骤A、内存预分配过程:首先确定点云数据文件中点的数目,从而确定点云数据文件中所有点需要占用的内存大小,然后预先为点云数据分配对应大小的内存;
[0022]步骤B、多点并写过程:通过内存映射文件机制,将点云数据文件映射到映射内存后创建含有指定数量线程的线程池,每个线程负责解析映射内存中的部分点数据信息,并将解析结果写入到之前预先分配的内存中,实现多点并写。
[0023]步骤A是为了快速确定点云数据文件中的点的数目并预先分配对应大小的内存;通过内存映射文件机制,结合线程池快速地将点云数据文件中的点数据读取到步骤A中预先分配的内存中,即多点并写技术。
[0024]【具体实施方式】二:如2图所示,本实施方式为【具体实施方式】一所述的基于内存预分配和多点并写技术的大规模点云数据快速读取方法的具体实现过程为:
[0025]步骤一、选择点云数据文件,
[0026]步骤二、确定点云数据文件中点的数目,采用数据分块方式确定点云数据文件中的点数目,
[0027]步骤三、分配相应大小的内存:根据点云数据文件中点的数目确定点云数据文件中所有点需要占用的内存大小,然后预先为点云数据分配对应大小的内存;
[0028]步骤四、将点云数据文件映射入映射内存中,
[0029]步骤五、创建含有指定数量线程的线程池,
[0030]步骤六、对映射内存文件分块,并对每一块文件数据的解析任务创建新线程,加入到线程池中,
[0031]步骤七、线程池中的活动线程执行解析任务,并将解析结果保存到预分配内存,
[0032]步骤八、判断线程中是否有活动线程,如果没有,则结束映射文件数据解析,否则返回步骤七直至完成映射文件数据的解析。
[0033]【具体实施方式】三:本实施方式中,在步骤二中所述的数据分块方式的具体操作过程为:分配指定大小的内存缓冲区(如64KB),利用文件I/O函数读取该大小的文件数据,并从数据中查找换行符(“\n”)的数目,以确定该块数据中的点的数目;如果该块数据中的最后一个字符不是换行符,则表明该块数据的最后一个点数据不完整,此时向前移动文件指针,使指针位置指向这个点数据的起始位置;然后重新利用文件I/O函数读取一块新的文件数据,重复此过程,直至文件中点的数据计算完毕。其它组成及连接关系与【具体实施方式】一或二相同。
[0034]【具体实施方式】四:本实施方式中,在步骤六中,对映射内存文件分块,并对每一块文件数据的解析任务创建新线程,加入到线程池中的过程为:
[0035]首先确定缺省的分块大小,如64KB,然后从映射文件内存起始地址B处创建一个解析任务,该解析任务经过计算后能判定合适的结束地址C,保证从B到C处的数据为完整的若干个点信息,并将该解析任务作为线程添加到线程池中执行,因此从B到C处的内存空间大小可能会比64KB略小;接下来从映射文件内存地址C+1处创建另一个解析任务,并按照上述过程计算结束地址D,并将该解析任务作为线程添加到线程池中执行;重复循环该过程,直至为每一个映射文件内存块都创建了解析任务,并添加到线程池中执行。其它组成及连接关系与【具体实施方式】一、二或三相同。
[0036]以上所述,仅为本发明较佳的【具体实施方式】,但本发明的保护范围并不局限于此,任何熟悉本【技术领域】的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。
【权利要求】
1.一种基于内存预分配和多点并写技术的大规模点云数据快速读取方法,其特征在于,所述方法为: 步骤A、内存预分配过程:首先确定点云数据文件中点的数目,从而确定点云数据文件中所有点需要占用的内存大小,然后预先为点云数据分配对应大小的内存; 步骤B、多点并写过程:通过内存映射文件机制,将点云数据文件映射到映射内存后创建含有指定数量线程的线程池,每个线程负责解析映射内存中的部分点数据信息,并将解析结果写入到之前预先分配的内存中,实现多点并写。
2.根据权利要求1所述的一种基于内存预分配和多点并写技术的大规模点云数据快速读取方法,其特征在于,所述方法的具体实现过程为: 步骤一、选择点云数据文件, 步骤二、确定点云数据文件中点的数目,采用数据分块方式确定点云数据文件中的点数目, 步骤三、分配相应大小的内存:根据点云数据文件中点的数目确定点云数据文件中所有点需要占用的内存大小,然后预先为点云数据分配对应大小的内存; 步骤四、将点云数据文件映射入映射内存中, 步骤五、创建含有指定数量线程的线程池, 步骤六、对映射内存文件分块,并对每一块文件数据的解析任务创建新线程,加入到线程池中, 步骤七、线程池中的活动线程执行解析任务,并将解析结果保存到预分配内存, 步骤八、判断线程中是否有活动线程,如果没有,则结束映射文件数据解析,否则返回步骤七直至完成映射文件数据的解析。
3.根据权利要求2所述的一种基于内存预分配和多点并写技术的大规模点云数据快速读取方法,其特征在于,步骤二中所述的数据分块方式的具体操作过程为:分配指定大小的内存缓冲区,利用文件I/O函数读取该大小的文件数据,并从数据中查找换行符的数目,以确定该块数据中的点的数目;如果该块数据中的最后一个字符不是换行符,则表明该块数据的最后一个点数据不完整,此时向前移动文件指针,使指针位置指向这个点数据的起始位置;然后重新利用文件I/o函数读取一块新的文件数据,重复此过程,直至文件中点的数据计算完毕。
4.根据权利要求2或3所述的一种基于内存预分配和多点并写技术的大规模点云数据快速读取方法,其特征在于, 在步骤六中,对映射内存文件分块,并对每一块文件数据的解析任务创建新线程,加入到线程池中的过程为: 首先确定缺省的分块大小,然后从映射文件内存起始地址B处创建一个解析任务,该解析任务经过计算后能判定合适的结束地址C,保证从B到C处的数据为完整的若干个点信息,并将该解析任务作为线程添加到线程池中执行;接下来从映射文件内存地址C+1处创建另一个解析任务,并按照上述过程计算结束地址D,并将该解析任务作为线程添加到线程池中执行;重复循环该过程,直至为每一个映射文件内存块都创建了解析任务,并添加到线程池中执行。
【文档编号】G06F12/02GK104268096SQ201410503690
【公开日】2015年1月7日 申请日期:2014年9月26日 优先权日:2014年9月26日
【发明者】张建生 申请人:西南科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1