关系数据库的 SQL 也无法高效完成。这个聚类运算本质上是个非等值连接,数据库对于等值连接还能采用 HASH JOIN 等优化方案来减少计算量,但对于非等值连接就只能采用遍历方案了;SQL 也无法在语句中实现上面设计的复杂过程,不能识别距离的单调性而主动排序并采用二分法;再加上本来做这类数学类计算的能力不足(距离计算涉及三角函数);所以发生了前面实验阶段中 SQL 的单核性能还跑不过 Python 的现象。
Java等高级语言虽然可以实现二分法,也可以很好的并行,但代码写起来冗长,开发效率过低,会严重影响程序的可维护性。
那么,还能用什么工具来完成这个任务呢?
集算器 SPL 是个很好的选择,它内置了很多高性能算法(如二分法),也支持多线程并行,代码写起来也简单明了,还提供了友好的可视化调试机制,能有效提高开发效率,以及降低维护成本。
实际效果
相较于 Python 来说,SPL 为本任务提速 2000 倍,二分法能够提速 500 倍,多线程并行又提速 4 倍(笔者笔记本电脑的 CPU 只有 4 核),总计提速 2000 倍,使用 SPL 完成 500 多万目标规模的聚类任务只需要数个小时。
SPL的代码不仅性能优异,而且也并不复杂,关键计算代码只要 23 行。
A  | B  | C  | D  | E  | |
1  | =RThd  | /距离阈值  | |||
2  | =NJob=4  | /并行线程数  | |||
3  | =file("BasePhoto.csv").import@tc()  | ||||
4  | =directory@p(OtherPhotos)  | /其他照片路径  | |||
5  | for A4  | =file(A4).import@tc()  | /其他照片  | ||
6  | =B5.sort@m(OnOrbitDec)  | /排序  | |||
7  | =B6.min(DEC)  | ||||
8  | =delta_ra=F(B7,RThd)  | /根据DEC算RA阈值  | |||
9  | =FK(B5,NJob)  | /数据索引分段  | |||
10  | fork B9  | =B5(B10)  | /照片片段  | ||
11  | for A3  | =C11.OnOrbitDec  | /DEC  | ||
12  |     
     
      
 
       
 相关阅读:
  | ||||
