最近在使用pcl库研究点云处理分析,中间结果以文本格式的pcd文件存储,直接使用pcl::io::loadPCDFile()函数读取文件,遇到了pcd文件读取过慢,耗时太长的问题,当数据量较大时这个问题更加凸显。

查阅pcl源代码(pcl-1.10.1)发现,真正执行文本格式pcd文件读取的函数 int pcl::PCDReader::readBodyASCII()中,使用getline()逐行读取文件内容,根据以往经验想当然认为是这行代码拖慢了速度,于是进行一番改造,自己建一个缓冲区(缓冲区长度为2048个字节),每次从文件中读取缓冲区长度的数据,再不断地从缓冲区中一行一行取数据处理,缓冲区中数据取完以后再从文件中读新数据,不断循环直至文件读取完成。

改造完成重新编译pcl,兴奋的验证一下成果,跟改造前比读取耗时居然没有什么变化。

于是开始头疼,不断质疑自己哪里写错了,老老实实地逐个函数逐行代码跟踪下来,发现最耗时的代码是readBodyASCII()中的copyStringValue()一行,于是继续查找这个函数的实现。

copyStringValue()这个函数定义在 pcl/io/file_io.h 文件中,如下图所示,pcl实现类型转换时用了std::istringstream的imbue这个函数,我怀疑是这里有问题,因为时间有限,采取最简单暴力的方式,把它注释掉,类型转换直接采用源代码中的atof()实现,果然速度获得大幅提升。

 对pcl源码改造后重新编译,编写应用程序测试改造前后对同一pcd文件读写效率如以下两图所示。快速模式比普通模式读取效率提升了5~6倍。

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐