问题描述

国家天文台有个聚类任务:共11份数据,每份数据是从一张照片中提取出来的,包含500多万条记录,每条记录是一个天体的坐标及属性。11张“照片”中有些天体坐标是重复的,但这些重复的坐标不完全相同,他们会有一些差别但距离不会太远。任务就是把其中一张“照片”作为基础,从其他照片中找出重复的天体,把重复天体的坐标及属性均值作为该天体的最终坐标和属性,即把距离很近的天体聚成一类再做聚合运算,这样就可以得到一张坐标清晰且信息更加准确的天体“照片”。

问题分析

这个任务不算复杂,只要循环基础照片中的每一个天体坐标,将其与其他照片中的每个天体坐标计算距离,不超过某个阈值就认为是同一个天体,视作一类,最后将每一类中所有天体坐标求均值就得到了该天体的坐标。

但是当用计算机计算时就发现这个任务的计算量是惊人的,基础照片需要循环500多万次,其中的每个天体坐标又要与其他照片中的5000多万个坐标计算距离,计算复杂度是500多万*5000多万,这将是个天文数字。

事实也确实如此,在实验阶段,把每张照片的数据量减小10倍,即每张照片的天体坐标量为50万,用Python写出代码实现上述方法计算出11张照片的聚类结果需要的时间是6.5天。按计算复杂度来算,500多万的数据量,计算量是50万数据量的100倍,即需要耗时650天,这肯定是一个无法接受的数字。

同样的50万数据量,被装入了某分布式数据库后用SQL实现,动用了100颗CPU后,跑了3.8小时完成了计算。看起来比Python快了很多倍,但Python的6.5天是单线程,细算下来SQL的单核性能还不如Python(3.8小时*100>6.5天)。巨大的资源消耗已经难以容忍,而且计算500多万规模时也要380小时。

解决方案

我们来考虑哪里可以优化以减少计算量。

基础照片中的天体坐标是必须循环的,这样才能保证每个天体都被用来聚类了,其他照片中的天体坐标不用每次都遍历,只要找到基础天体坐标附近的坐标就可以了。这类查找任务很适合二分法,它可以大量减少计算量。

具体过程是这样的:先对每张照片中的天体坐标排序,用二分法找到某个阈值范围内的天体坐标,这样就排除了大多数天体,这是粗筛过程;用基础天体与粗筛结果中的天体计算距离,找出符合条件的结果,这是细筛过程。

来看看粗筛加细筛方法的计算量,10张照片每张排序一次,计算量是500万*log(500万)10;二分法粗筛,计算量是500万log(500万)10;细筛过程,计算量不确定,但根据经验,粗筛后的结果通常不超过1万个,粗筛的计算量中log(500万)还要再加1万;这样算下来,总的计算量大概是500万log(500万)10+500万(log(500万)+1万)*10,相较于原来的方法,计算量只有原来的五百分之一。

技术选型

方法有了,还要选择程序工具,之前实现时使用Python,不可否认Python很强大,有天文学计算的现成框架,比如计算距离的方法,只要调用现成的类库就可以轻松算出来。

但Python也有着非常严重的弊端:

  1. Python中没有原生的二分法方法,第三方的类库还要结合Pandas来完成,期间需要做一些数据转换,这些都必然会带来一些不必要的开销。

  2. Python的多线程是假多线程,实际上不支持多线程并行,这也是Python不能成为本任务工具的重要原因。

关系数据库的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 =D11-delta_rad /DEC下限
13 =D11+delta_rad /DEC上限
14 =C11.RA /RA
15 =D14-delta_ra /RA下限
16 =D14+delta_ra /RA上限
17 =C10.select@b(between@b(OnOrbitDec,D12:D13)) /二分查找DEC
18 =D17.select(RA>=D10&&RA<=D11) /查找RA
19 =D36.select(Dis(~,C11)<=A7) /细筛
20 if D19!=[] /合并结果
21 =FC(C11,D37)
22 =@|B10 /汇总结果
23 =file(OFile).export@tc(B22) /写出结果

B10格的fork是多线程并行函数,允许分段执行上述算法。

B6格的sort@m()函数是并行排序方法,数据量大时可以提高效率,数据有序是二分法使用的前提条件。

C17格的select@b(…)函数是二分查找方法,也是本任务提速的关键。

后记

性能优化的问题依赖于高性能的算法,只有把计算量降下来才能有效提高运行效率,而高性能算法需要在工作中慢慢积累,感兴趣的同学可以来这里学习常用的性能优化算法:性能优化课程。

高性能算法需要高效的编程工具来实现,之前已经说过,Python、SQL、java等语言都有其弊端,要么无法并行,要么实现困难、维护困难。SPL有足够的算法底层支持且允许高并发,代码能做到很简洁,还提供了友好的可视化调试机制,能有效提高开发效率,以及降低维护成本。

SPL资料

  • SPL下载
  • SPL源代码

SPL 提速天体聚类任务 2000 倍相关推荐

  1. 【云原生】SPL 提速天体聚类任务 2000 倍【文末送书】

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦.

  2. GPU上的随机森林:比Apache Spark快2000倍

    作者|Aaron Richter 编译|VK 来源|Towards Data Science 随机森林是一种机器学习算法,以其鲁棒性.准确性和可扩展性而受到许多数据科学家的信赖. 该算法通过boots ...

  3. 国产芯片传来好消息,纯国产CPU测试数据“曝光”

    ‍ ‍数据智能产业创新服务媒体 --聚焦数智 · 改变商业 任务背景 国际大环境就不用多说了. 对于数据库类的关键业务,全国产技术(国产 CPU+ 国产数据库)和国外主流技术在性能上相比还有不小的差距 ...

  4. 分布式是大数据处理的万能药?

    使用分布式集群来处理大数据是当前的主流,将一个大任务拆分成多个子任务分布到多个节点进行处理通常能获得显著的性能提升.因此,只要发现处理能力不足就可以通过增加节点的方式进行扩容,这也是很多拥趸者最朴素的 ...

  5. 仅用笔记本电脑解析90%蛋白质,单卡推理序列长度破万!Colossal-AI开源方案让AlphaFold推理提速5倍,显存降低75%

    蛋白质是生命的物质基础,几乎支持着生命的所有功能.弄清楚蛋白质折叠成什么形状被称为 "蛋白质折叠问题",在过去的50年里一直是生物学的一个巨大挑战.AlphaFold将Transf ...

  6. 一文道清什么是SPL

    SPL资料 SPL官网 SPL下载 SPL源代码 现在解决数据库自主化问题的办法只能是自强,将数据库核心技术掌握在自己手里,做属于自己的国产数据库.其实,这个事我国也已经张罗了几十年,早在上世纪80年 ...

  7. 开源 SPL 优化报表应用应对没完没了

    现在应用中的报表大都使用报表工具开发,成熟的报表工具提供了丰富的显示设置.图表类型.导出打印等功能可以简化报表开发,非常方便.但是,实际报表开发中还是经常碰到一些非常棘手的深层次问题,即使是已经熟练使 ...

  8. 为什么姜黄素+胡椒碱会让姜黄素吸收率增加2000%以上

    胡椒碱能让姜黄素吸收率达到2000%倍以上 这一重要结论出自[1] Reference: [1]Influence of Piperine on the Pharmacokinetics of Cur ...

  9. 层次聚类算法 算法_聚类算法简介

    层次聚类算法 算法 Take a look at the image below. It's a collection of bugs and creepy-crawlies of different ...

最新文章

  1. Hyperlink的target属性的用法
  2. 第2章:Maven的安装/2.2 Linux下的安装
  3. 【机器学习】高斯判别分析
  4. c语言发牌思路,C语言发牌机程序求详细解析
  5. ClassNotFoundException:是否会减慢您的JVM?
  6. 后台系统可扩展性学习笔记(十二)NoSQL
  7. 解决Vmware中安装Ubuntu Server 14.04 分辨率无法全屏问题
  8. 广发银行创新“智慧金融”打造“智慧城市”
  9. 使用Hexo搭建专属Blog
  10. FireFox如何使用扩展
  11. Android 导入导出excel xls、xlsx
  12. AD15怎么导入图片做丝印 或者做 LOGO
  13. 基金会要申请银行账户吗
  14. 机器学习:python常用可视化技巧
  15. HTML5期末大作业:餐饮美食网站设计——绿色的餐饮美食网站(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  16. Spine皮肤系统使用
  17. 【MySQL自学之路】第2天——关系代数计算【理论知识】
  18. chrome使用技巧(看了定不让你失望,不错)
  19. windows7系统Prolific USB-to-Serial Comm Port问题
  20. 中信soeasy网络硬盘 瑞星杀毒软件升级包

热门文章

  1. 嵌入式一般操作位标识转A123含义
  2. 视频如何转换成MP4格式?分享三个转换方法
  3. heartbeat如何监控程序_heartbeat+drbd监控脚本(自动发现问题,并邮件通知)
  4. 富士通ScanSnap的S1500文档扫描仪 - 最佳的方式去无纸化
  5. 文档翻译器怎么用?实用的语音翻译文字的方法介绍
  6. (20190117)GBT 18314-2009 全球定位系统(GPS)测量规范
  7. 2018华为ICT大赛企业网络方向初赛大纲(来源自华为官方)
  8. MATLAB中输出科学计数法_MATLAB中的常量与变量
  9. FastJson简单使用
  10. 【1039】多边形三角剖分的最低得分