AI辅助3dtiles数据处理工具编写总结
前言
AI编程出来时间不短了,我的感受从开始的“人工智障?不过如此”,到试用 cousor时,”我艹,饭碗没了”,再到如今,”我艹,是个好工具”,总之现在还是没有过”我艹”的阶段,总感觉太不真实,工具在不断进步,我也依旧在探索。
起源
本篇主要讲在使用Ai的过程中,我重复造轮子的一些感想,目标功能是将las文件转为3dtiles的pnts,我本身工作使用c++和js较多,偶尔使用python写脚本,很早以前用过C#。因为工作中有使用C++写了工具处理数据,对于3dtiles的数据格式有一定的了解。由于历史原因,现有的工具感觉改起来很复杂,一直想使用别的语言重写一套,并且如果能做个界面,能有收入,让工具进入一个维护的正向循环那就最好。
由于有过处理数据的经验,这里几个点是我比较关注的
- 想做成 PC 端的工具,优先命令行的,最好是做成有界面的,主要因为很多数据别人都是保密的,上传服务器不合适,而且界面的对用户友好一点。
- 效率问题,以c++工具为基准,预期不超过基准时间的2倍
- 空间占用问题,由于输出的数据基本空间占用是固定的,这里考虑程序运行过程中对内存占用,也是不超过基准2倍
- 要能够处理大数据,这里就要考虑到使用文件型数据库的问题
- 最终可运行的包的大小,越小越好
- 最好能跨平台
- 代码安全
过程
注意:一定要使用git
使用 Python 重写
之所以首选 python,是因为太方便了,我平时写脚本,基本上AI一开,描述一下,它就吭哧吭哧写去了,然后一运行,简单改改,就结束了。
我最先开始是从读写官方Cesium包中的示例数据开始,然后扩展到读取las数据,构建Lod,再进行瓦片抽稀输出,整个过程玩的很爽,就搁那一直问问问,然后接受接受,它就能运行了。但是其中有几个问题:
- 碰到细节的逻辑问题时,它可能会频繁答错,这个时候,需要人工接管进行调试,有时候人很难进入状态,因为一直点接受,到调试的时候感觉有点受不了要一行一行的去看变量了,虽然以前调试也是这么干的。
- 在找一些第三方库的时候还是会碰到很多兼容性问题,或者是根本没有,比如运行时先通过使用文件型数据库存放数据,减小内存压力,有一些库比如levelDB,rocksdb等都很麻烦,后来使用DuckDB和sqlite尝试,最终也解决了一部分问题
- 写完代码要打包的时候发现那么多界面,没一个好用的,都特别慢(也可能时我学艺不精),而且安装的包都很大,一个 venv 里面动不动就是大几百兆,1G的,打出来的包都很大。
- 试过 PyInstaller ,cx_Freeze,无法保护代码,Nuitka可以保护代码但是太麻烦了,有些库比如numpy都有特殊版本。
最终,两个星期写了个 Demo 出来,实现了最基础的功能,也只是最基础的了,小数据可以和c++速度持平,空间占用高一些,打包太大,而且打包之后基本会暴露代码,如果是作为产品,我自己都没分发的欲望。
使用 c# 重写
用 c# 重写最开始是因为如果不考虑跨平台,在 windows 上面写界面,它是比较好的选择,我最开始只用过 Winform,后面用 PortableBasemapServer 的时候包很小,作者使用一个Esri的dll就展示了二维地图,基本是我了解到的除了webgis以外最轻量的做法,所以有开始用AI辅助来做。
这次代码编写过程没有 python 那么爽,因为老是到界面上点点点(我用的vs2022,nuget要点,切换工程要点等等),当然也遇到了一些问题:
- 很意外,nuget上面很多包虽然很老,都是可用的,安装也比较方便,最终打包是也很小
- vs2022 自带了 Copilot,但是除了建议模式没找到入口切换模式,每次还得上下滑动找应用按钮
- AI 写出的代码基本不考虑内存,cpu之类的问题,我有多次让它优化,但是优化效果还是有限,最后是人工接管,调试代码做的优化,写 c++ 搞成了习惯,我每次创个类对象,数组啥的就不自觉的想什么时候去析构它,但是频繁强制调用 GC 的话,反而会减慢速度。
- 里面的内存有点难把握,搞不懂调试的时候只是初始化一个数据结构 Dictionary<int, Dictionary<GeoPyramidTile, TileData>> 为什么内存涨了 30多M
- c# 的很多语法糖很好用,比如并行 Parallel 好用是好用,但是耗费资源也是厉害,风扇咔咔转。
编码时间一个星期左右,实现了基本功能,后续可能继续开发,打包很小,目前整算下来50M左右(不算提前转.net环境)
总结
AI 现在基本已经进入到工作的常用工具库之中了,当时我在感觉自己要被 AI 替代的时候也有想过,自己将要是什么定位,自己应该怎么走,而且一直在验证这个想法。AI 是工具,至少目前是工具,而且是一个好工具。
- 要做什么,首先你得知道自己要做什么,最好是知道主要的步骤是哪些,工具才能给你提升效率。一两个星期我自己写这个这样的demo,这在以前我是不敢想的.
- 它可以帮你快速完成一些事,比如写一个长的循环,你自己要敲键盘打字都要花10分钟,它帮你 1 分钟搞定,你可能花 1 分钟微调,这个阶段,它让你的效率提升了 5倍,但是调试代码的时候,你自己改要 1个小时,它来改,可能十分钟也可能花你4个小时或者更多,这个时候,它的效率提升是不明确的,甚至你对着它问了两天还解决不了问题,我认为这个就是目前人工最重要的价值,知识的深度开始慢慢比广度重要了,因为广度太容易被 AI 替代了
- 个人认为,现在编码的门槛变高了,因为更考验人性了,如果初学的时候就有 AI 加持,你还愿意静下心来一行一行敲代码去琢磨这一句变量的值会怎么变化吗?
- 有一个观点说,AI 是个放大镜,我同意一半,实力越强的人工具提升的效率更高,对于小白来说,也确实可以基于它做一些事情。
拥抱AI吧~~