关系数据库的 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 |
相关阅读:
|