如何在C语言中实现类似MATLAB的高效点云数据存储与读取?
大体积点云数据的快速读写方案(C语言环境)
1. 转换为二进制格式存储
文本格式的核心痛点是读写时必须做ASCII与数值的双向转换,耗时极长。换成二进制直接存储内存中的原始数据,读写速度能提升5-10倍,同时文件体积也会缩小(比如一个float占4字节,文本格式可能要占6-8字节)。
- 先定义点云数据的结构体:
typedef struct { float x, y, z; // 若有强度、RGB等额外属性,直接加入结构体即可 } PointCloud; - 首次处理时,将txt中的数据解析为结构体数组,用
fwrite批量写入.bin文件;后续读取时,直接用fread将数据一次性读入内存,无需逐行解析。 - 务必在文件开头写入一个
size_t类型的数值,记录总点数,读取时先读这个数值,再分配对应大小的内存空间。
2. 用内存映射(mmap)处理超大文件
如果单份文件体积达到几十GB,传统fread的IO开销依然明显。内存映射可以直接将磁盘文件映射到进程地址空间,相当于直接操作内存,能大幅减少用户态与内核态的IO切换开销。
- 示例代码片段:
int fd = open("pointcloud.bin", O_RDONLY); off_t file_size = lseek(fd, 0, SEEK_END); PointCloud* cloud = mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, fd, 0); // 直接通过cloud[index]访问对应点的数据 munmap(cloud, file_size); close(fd); - 这种方式尤其适合需要随机访问数据的场景,读取效率远高于传统IO方法。
3. 压缩二进制格式(兼顾空间与速度)
若磁盘空间紧张,可采用轻量级压缩算法(如zlib)对二进制数据进行压缩存储。点云数据本身存在一定冗余,压缩比通常能达到2:1甚至更高,且读取时的解压CPU开销远小于文本解析的开销。
- 写入时将结构体数组压缩后存盘;读取时先解压到内存再处理,整体速度仍远快于文本格式。
4. 预建索引(针对“读取特定信息”的需求)
如果你的需求不是全量读取,而是提取特定范围的点数据,提前建立索引能节省大量时间:
- 比如常按Z轴范围查询,就预先计算并存储不同Z区间的点在文件中的偏移量,可单独存为索引文件,或放在主文件开头。读取时直接跳到对应位置读取,无需遍历全量数据。
关于MAT-file的替代方案
MAT-file本质也是二进制格式,但C语言读取它需要依赖MATLAB的libmat库,会增加编译与部署的复杂度。自行实现二进制格式完全无外部依赖,速度也更快,无需强行沿用MAT-file。
内容的提问来源于stack exchange,提问作者刘旻喆
相关产品推荐
相关产品推荐

