如何判断一个经纬度是哪个省?
需求是这样的,有个卖gps防盗器的公司,需要分析出用户去年一年内经过了那些城市?假设有10万个用户,每个用户有100万个轨迹点。我们怎么分析呢?
常规方法是一个点一个点的分析,那就是10w*100w=1000亿个点每一个去调用地图接口分析,首先调用接口耗时,其次这么多点跑几个月都未必跑得完。显然我们要寻找更科学的办法。
如何分析呢?网上可以借鉴一些方法,但是我还是喜欢自己动脑经。我按如下步骤操作
1、对经纬度进行规划,把所有点保留到小数点2位,精确度上可能造成几百米几公里的误差,这个误差是可以接受的。
2、保留小数点后就会发现很多重复的经纬度。那么我们只需要有个高速缓存,存在的经纬度直接用已有的,没有的调用接口。
3、每个用户的查询结果存储在哪里呢,我觉得大部分数据库是不合适的。量太大了,因此我选择sqlite,这样每个用户一个sqlite,而且我们分析的时候会产生10w个小sqlite。这10w个sqlite存储位置也得规划,如分成1000份。取用户id前3个数字000-999做数据库文件夹。这样每个文件夹数据库量也不会很多。
4、代码开发和运行。代码其实是比较简单的,但是因为量大,我们得使用合理的多线程,首先我们需要看一下我们地图api的接口是否限制了调用频率, 如并发只有10,那么我们就要考虑做接口池。如果并发100就基本可以忽略了,正常开20-50线程不用担心接口并发问题。实际使用中,大部分个人认证的接口并发很少,企业认证的蛮多。当然还有一种方法就是用多个帐号申请接口增加并发,一般不能太离谱,否则会被查封。我们是采用多个帐号申请接口加接口池子来优化并发的,接口池子就是做个接口实现内部调用,控制并发结合锁的原理让调用地图接口相对顺畅一点。以我电脑性能,多了20个线程在跑。
没有专业学习过大数据分析,当成普通需求处理的,自己分析的也是接近部分大数据分析入门的分析方案的。当然我上面描述的步骤都是在入坑后优化的最终步骤,如地图接口是遇到瓶颈的,这才想到多开几个帐号,自己通过池子控制外部接口调用成功率。池子别人或许是有专门的框架,我是自己手写的,性能或许达不到专业框架,但是从我个人的角度,尝试就是成长。很多时候我们创新都是在不断尝试不断努力后的结果。当然这是全栈程序猿的思路,很多程序猿是想做一项专一项,这样好找工作,也没问题。只是大家的思想不一样而已,后面有机会专门聊一下这个问题。