
1. 点云数据的解析成图模块设计 测试环境需要自行配置jsoncpp、OpenCV运行环境
i5-9400f 16g (测试情况和实机性能有关)
线程解析(以法如的三维扫描仪生成的fls文件为基础)1.多线程解析数据效率
2.单线程和解析
3.新环境重测 (i7-9700+16g+GTX1660Ti )
2021年11月23日下午3点结果:
每个fls解析的平均时间:c++===》16.42秒
扫描仪生成一个FLS文件的时间是约30S
此测试过程包括解析fls—里程解析----空间解析处理----成图
第一版是在i5处理器上进行的,之后我做了调整,就在i7处理器上运行了
第二版的测试情况- 2mm(成图的精度,不懂的自行查阅OpenCV)成图内存占用情况
- 2mm成图cpu占用情况
- 5mm成图内存占用情况
- 5mm成图cpu占用情况
多线程解析
- c++第一版的运行过程中出现132秒长时间的占用4G内存的情况
- c++第二版的运行过程以梯度的形式占用内存,也就是上表中占用内存的记录只用1秒,之后又会逐渐减低。减少在磁盘的读写频率
多线程解析fls(当前环境同时开了10个线程解析fls效率出现严重低下,所以没有10个以上的多线程解析数据分析)
- 2mm成图多线程解析2个占用情况
- 2mm成图多线程解析3个占用情况
- 2mm成图多线程解析4个占用情况
- 2mm成图多线程解析5个占用情况
- 5mm成图多线程解析2个占用情况
- 5mm成图多线程解析3个占用情况
4.图片质量
5.设计思路
- 数据存储
* 问题:数据的处理量达到了上千万级别,在程序运行一段时间之后,再次进行数据读入 *** 作,会出现内存溢出的异常。
* 原因:对较大的数据量的数组进行较为频繁的读入 *** 作(数组大小为500M以上),在循环中创建了多个对象。
* 解决:c++版本采用容器代替数组来承载数据,安全、防止爆栈
* 对比起数组,vector是安全的(假设一个arraylist里现在只有给产品可以消费,但是有两个消费者线程请求消费,数组就会出现:可能出现一个产品被同时消费的问题,这与实际不相符。至于vector容器不会出现数组的问题,因为内部机制是同一时刻只能有一个线程对这个变量 *** 作)
* 防止爆栈,用于存储对象的数组存放在栈中,一般机器的栈大小是1~2M,vector存在堆中,对象是存在堆中,windows的堆空间,约2G。
1. 指针大小:内存是由字节组成的,每个字节都有一个编号。指针变量主要是存放相同数据类型的变量的首地址。这里的这个地址其实就是内存的某个字节的编号。而这个编号的确定是与地址总线有关。如果地址总线是32位,则它的寻址范围是02^32(04G)。那么为一个字节的编址就会由32个0或者1组成。例如第一个字节的编址是32个0,最后一个的编址是32个1。一个字节有8位,32位则需要4个字节。
2. 对象大小:组成(对象头8字节,指针4字节,数据存储区域(不定,int是4字节,char是2字节),对其补充(补充到整个大小为8字节的倍数)),存储int类型对象是16+x,存储char对象是14+x
以上储存int对象的大小是指针的4倍以上。
使用openCV生成当通道图,8byte(成对象的图像数据需要byte类型),byte对应的c++版本是unsinged int
1MB = 1048576字节 = 32768个int对象(c++)
2MB = 2097152字节 = 65536个int对象(c++)
2G = 2048MB = 2147483648个字节 = 67108864个int对象
单个fls解析出来的数据量是19492421个对象,无论是1M还是2M的栈空间都不够存放
存放在堆空间的情况下,可解析的fls内容量可以是现在fls数据量的3倍
3. 实际上c#版本,正常来说,已经出现爆栈的情况 得益于c#对内部分段计算优化,在C#中使用数组,可以获取在内存上连续的相同类型的一组变量,在连续访问时可以满足CPU访问寄存器的时间局部性和空间局部性,大大提高了对大量数据的访问效率
当然你可以手动的去给栈分配更大的空间来防止这样的情况。
6.运行过程
7.源码地址 大家参考和共同学习 谢谢
https://gitee.com/lihenggeek/deer-project.git
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)