文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/算法
项目中有1000万条历史案卷,为某地方坐标系数据,咱们的真实需求是将地方坐标系坐标反转成WGS84坐标,若是如今须要将其转换成百度坐标系数据。常规方案是先创建好整个该市的本地坐标和百度坐标之间的控制点库后再进行转换。可是在具体实施中发现转换特别慢,因为控制点库也有200多万条记录,大概一个点须要一秒钟才能转换完。sql
最开始采用的是坐标转换完后,直接update历史案卷表。因为update的效率是相对低的,尤为是有一千万条记录时,即便对主键也作了索引,依然效率不高。这里便采用新建一张空表再insert的方案。同时考虑到没必要要的字段太多,数据量太大,因此只将历史案卷的主键和坐标insert到新表中的方案进行优化。大概一个坐标转完能够是0.9秒左右,有必定提升,但不是特别明显。数据库
原始算法的转换步骤是:先从历史案卷表中获取一条记录,再根据记录坐标去控制点库获取该坐标对应的四角坐标的坐标值,而后再根据算法转换。微信
最明显的瓶颈将出如今:多线程
a.从历史案卷中获取坐标的时间。测试
b.从控制点库中获取到两条记录(左上角控制点对,右下角控制点对)的时间。优化
能够想象,每次遍历完整控制点库是最消耗效率的地方。因此这里将采用对控制点库进行分库的优化方法。具体思路为,将控制点库按照每隔2万米,分割成一个独立的表。当坐标进行转换时,首先算出坐标落在哪一个控制点表中,而后查询该表进行转换。spa
如今测试将控制点库分红了16个表,效率提升到一秒钟能够转换5个点,大概也就是0.2秒转换一个。能够预见若是分更多表效率将更大的提升。不过考虑到避免数据太过碎片化不利于管理。这里将再进行分区的优化尝试。线程
Mysql中提供了Range、List、Hash、Key四种分区方法,这里因为是地理坐标范围,因此采用Range来进行分区。目前将进行每5000M的范围作一个分区。blog
改完后效率变成了一秒能够转换20个左右坐标。
因为待转换数据太多,致使插入数据在进入几十万条后明显变慢。而且以前是转换完一条就立马插入,这也致使数据库操做频繁,效率降低。
因此这里改为:
a.批量插入,即以事物形式一次插入千条数据。
b.分表插入,当插入满50万条后,则建立新的表,继续插入。
此次修改后,效率又提升很多,大概到每秒转换30多个点。
启用多线程进行转换,目前开启四个线程。转换效率能够达到每秒100个左右。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^