前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【云原生】SPL 提速天体聚类任务 2000 倍,属实是牛逼

【云原生】SPL 提速天体聚类任务 2000 倍,属实是牛逼

作者头像
码农飞哥
发布于 2022-12-08 13:49:31
发布于 2022-12-08 13:49:31
3140
举报
文章被收录于专栏:好好学习好好学习

问题描述

国家天文台有个聚类任务:共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有足够的算法底层支持且允许高并发,代码能做到很简洁,还提供了友好的可视化调试机制,能有效提高开发效率,以及降低维护成本。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农飞哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
01 使用LSTM模型预测双色球,中大奖指日可待!
上班空闲之余,同事们经常去买买彩票乐呵乐呵,希望中了头等奖就可以走上人生巅峰,哈哈哈!
测试开发囤货
2021/09/08
7.7K1
分析了16年的福利彩票记录,原来可以用Python这么买彩票
上周被一则新闻震惊到了,《2454万元大奖无人认领!福彩史上第二大弃奖在广东中山产生 》,在2019年5月2日开奖的双色球中,广东中山一位彩民博中2454万元,兑奖时间截至2019年7月1日。
周三不加班
2019/07/15
1.9K0
分析了16年的福利彩票记录,原来可以用Python这么买彩票
bs4爬虫实战二:获取双色球中奖信息
目标分析: 访问双色球网站:http://www.zhcw.com/ssq/kaijiangshuju/index.shtml?type=0 右键查看源代码,发现这个框架的数据来源于: http:
py3study
2018/08/03
1.1K0
【玩转Python系列】【小白必看】使用Python爬取双色球历史数据并可视化分析
这部分代码导入了需要使用的库。requests库用于发送网络请求,lxml库用于解析HTML,csv库用于处理CSV文件,matplotlib.pyplot库用于绘制图表,matplotlib.font_manager.FontProperties库用于加载自定义字体。
全栈若城
2024/02/29
9920
【玩转Python系列】【小白必看】使用Python爬取双色球历史数据并可视化分析
Python爬虫+数据可视化:分期并预测双色球中奖号码
红球一共6组,每组从1-33中抽取一个,六个互相不重复。然后蓝球是从1-16中抽取一个数字,这整个组成的双色球
松鼠爱吃饼干
2021/09/02
5.6K0
爬取500双色球彩票
url = "http://kaijiang.500.com/shtml/ssq/"+number+".shtml"
得野
2019/08/29
8590
爬取500双色球彩票
python计算双色球数字概率_python绘制双色球走势图
友情提示:双色球预测分析只为练习技术,不要抱着预测中大奖的心态,不可能预测准确。 python数据分析1:获取双色球历史信息 python数据分析2:双色球 蓝红球分析统计 python数据分析3:双色球 单个红和蓝球哪个比例高 python数据分析4:双色球 两个红和蓝球哪组合比例高 python数据分析5:双色球 两个红球哪组合比例高 python数据分析6:双色球 使用线性回归算法预测下期中奖结果
全栈程序员站长
2022/09/24
1.8K0
python计算双色球数字概率_python绘制双色球走势图
python3结合BeautifulSoup和requests爬取双色球开奖结果
查看其框架源码可知,其获取的url为:http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html
游离于山间之上的Java爱好者
2022/08/09
8290
python3结合BeautifulSoup和requests爬取双色球开奖结果
【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)
今天小麦苗给大家分享的是【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)。
AiDBA宝典
2019/09/30
4850
【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)
爬取拉勾网招聘信息并使用xlwt存入Excel
通过浏览器自带的开发者工具查看是通过Post方式提交的,数据是通过Ajax(异步加载)得到的
Python攻城狮
2018/08/23
5240
爬取拉勾网招聘信息并使用xlwt存入Excel
​selenium实战爬取股票
selenium库的使用 项目的灵感 <img src="https://img-blog.csdnimg.cn/20201122112749272.png?x-oss-process=image/w
ruochen
2021/11/20
5730
【爬虫】(二)爬取西电教务处成绩
爬虫之西电教务处成绩测试代码,遇到验证码,已挂。 # -*-encoding:utf-8-*- # coding=utf-8 __author__ = 'ysc' import requests from bs4 import BeautifulSoup import xlrd import xlwt class ScrapeGrade: def __init__(self, auth_url=None, log_url=None): if not auth_url:
一点儿也不潇洒
2018/08/07
9150
selenium+phantomjs爬取
今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618.html
py3study
2020/01/16
6550
Python爬虫:把爬取到的数据插入到execl中
前面我们把大量数据已经爬取到了本地,但这些数据如果不存储起来,那么就会变得无效.开始本文之前,请确保已经阅读。
龙哥
2018/10/22
1.6K0
Python爬虫:把爬取到的数据插入到execl中
python查询MySQL写入Excel
在基础写法中,需要指定表的字段,比如:['id','username','password','phone','email']
py3study
2020/05/14
9.4K1
python查询MySQL写入Excel
js 实现双色球
前端代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> *{ padding: 0; margin: 0; } li{ list-style: none; width: 50px; height: 50px; border-radius: 50%; text-al
姜姜178
2022/11/18
1.2K0
Python获取彩票信息(一)
学习python相关知识:参考尚学堂项目案例学习通过python获取双色球彩票信息。
俊才
2023/01/16
6350
技术 | Python的从零开始系列连载(三十七)
为了解答大家学习Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~
灯塔大数据
2019/03/07
3930
bs4--xlwt存入excel
先写一个简单的python程序测试一下,创建一个名为excelwrite.py文件,代码如下:
py3study
2018/08/03
7840
用Xpath,bs4,正则三种方式爬51job
最近和星球球友一起做了一个爬取51job上的Python招聘职位的项目实战,数据如下:
龙哥
2018/10/22
8760
用Xpath,bs4,正则三种方式爬51job
推荐阅读
相关推荐
01 使用LSTM模型预测双色球,中大奖指日可待!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档