Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一种能让大型数据聚类快2000倍的方法,真不戳
国家天文台有个聚类任务:共11份数据,每份数据是从一张照片中提取出来的,包含500多万条记录,每条记录是一个天体的坐标及属性。11张“照片”中有些天体坐标是重复的,但这些重复的坐标不完全相同,他们会有一些差别但距离不会太远。任务就是把其中一张“照片”作为基础,从其他照片中找出重复的天体,把重复天体的坐标及属性均值作为该天体的最终坐标和属性,即把距离很近的天体聚成一类再做聚合运算,这样就可以得到一张坐标清晰且信息更加准确的天体“照片”。
川川菜鸟
2022/08/10
4840
一种能让大型数据聚类快2000倍的方法,真不戳
国产CPU执行SPL实现数据库运算的性能实用性测试
对于数据库类的关键业务,全国产技术(国产CPU+国产数据库)和国外主流技术在性能上相比还有不小的差距,经常需要借助分布式技术使用数倍的硬件才能获得类似的效果。
石臻臻的杂货铺[同名公众号]
2022/10/31
8610
分布式是大数据处理的万能药?
使用分布式集群来处理大数据是当前的主流,将一个大任务拆分成多个子任务分布到多个节点进行处理通常能获得显著的性能提升。因此,只要发现处理能力不足就可以通过增加节点的方式进行扩容,这也是很多拥趸者最朴素的想法。以至于当我们接触一项新的大数据处理技术往往首先问的就是支不支持分布式以及能支持多大规模的集群,可见“分布式思维”已经根深蒂固。
用户10216580
2022/12/22
2700
分布式是大数据处理的万能药?
没错,列式存储非常牛。但是,Ta还可以更高效
很多数据仓库产品都采用了列式存储。如果数据表的总列数很多而计算涉及的列很少,采用列存就只读取需要的列即可,能够减少硬盘访问量,提高性能。
不吃西红柿
2022/08/03
8240
SQL后计算的利器SPL
现代应用开发中,通常只用SQL实现简单的数据存取动作,而主要的计算过程和业务逻辑直接在应用程序中实现,主要原因在于:
灰小猿
2022/09/02
1.2K0
不用 SQL 的数据仓库
当前绝大部分数据仓库都会采用 SQL,SQL 发展了几十年已经成为数据库界的标准语言,用户量巨大,所以支持 SQL 对于数据仓库来讲也是很正常的。但是,在当代大数据背景下,业务复杂度节节攀升,在以计算为主要任务的数据仓库场景下,SQL 似乎越来越不够用了。典型表现是一些数据仓库开始集成 Python 的能力,将 Python 这样的非 SQL 语言融入到数据仓库中。且不论两种风格迥异的开发语言是否能很好融合互补,单看这样的趋势已经足够表现出业界对 SQL 能力的一些质疑。
搜云库技术团队
2023/10/21
2330
不用 SQL 的数据仓库
提速资产负债表60倍
X 公司资产负债表,访问人员众多,访问频次很高,明细数据约 6000 万,业务人员要等待 60 秒以上才能看到结果,响应速度严重影响业务,急需优化。
朱迪
2024/11/04
1470
跑批为什么这么难?
业务系统产生的明细数据通常要经过加工处理,按照一定逻辑计算成需要的结果,用以支持企业的经营活动。这类数据加工任务一般会有很多个,需要批量完成计算,在银行和保险行业常常被称为跑批,其它像石油、电力等行业也经常会有跑批的需求。
朱迪
2024/11/08
1420
有没有完全自主的国产化数据库技术
前段时间的俄乌冲突,Oracle 宣布“暂停在俄罗斯的所有业务”,相信大家的心情绝不是隔岸观火,而是细思恐极。 数据库号称 IT 领域三大核心之一(其他两个是 CPU 和操作系统),一直以来都被国际巨头垄断,人家控制着核心,想什么时候锁喉就什么时候锁,你一点办法都没有。 现在解决这个问题的办法只能是自强,将数据库核心技术掌握在自己手里,做属于自己的国产数据库。其实,这个事我国也已经张罗了几十年,早在上世纪 80 年代以研究所和大学为主的国家队就开始投入研发国产数据库,并在 90 年代相继推出了几款数据库产
用户1564362
2022/07/20
7040
有没有完全自主的国产化数据库技术
Java 结构化数据处理开源库 SPL
现代Java应用架构越来越强调数据存储和处理分离,以获得更好的可维护性、可扩展性以及可移植性,比如火热的微服务就是一种典型。这种架构通常要求业务逻辑要在Java程序中实现,而不是像传统应用架构中放在数据库中。
看、未来
2022/05/17
5400
你用 Python 写过哪些牛逼的程序/脚本?
【导读】:有网友在 Quora 上提问,「你用 Python 写过最牛逼的程序/脚本是什么?」。本文摘编了 3 个国外程序员的多个小项目,含代码。 Manoj Memana Jayakumar, 30
小小科
2018/05/04
1.1K0
你用 Python 写过哪些牛逼的程序/脚本?
常用编程思想与算法
本文是在阅读Aditya Bhargava先生算法图解一书所做的总结,文中部分代码引用了原文的代码,在此感谢Aditya Bhargava先生所作出的这么简单的事例,对基础算法感兴趣的朋友可以阅读原文。由于本人也是编程初学者,所以本书比较浅显易懂,所介绍的算法配上插图也十分易懂,这里只是介绍几种最基础的算法由浅入深以帮助理顺一些简单的思维逻辑。
用户3148125
2018/09/03
8590
【云原生】内存数据库如何发挥内存优势
LogiKM(改名KnowStreaming) 是滴滴开源的Kafka运维管控平台, 有兴趣一起参与参与开发的同学,但是怕自己能力不够的同学,可以联系我,当你导师带你参与开源! 。
石臻臻的杂货铺[同名公众号]
2022/09/07
1.3K0
人人都能看懂的机器学习!3个案例详解聚类、回归、分类算法
机器学习,一言以蔽之就是人类定义一定的计算机算法,让计算机根据输入的样本和一些人类的干预来总结和归纳其特征和特点,并用这些特征和特点和一定的学习目标形成映射关系,进而自动化地做出相应反应的过程。这个反应可能是做出相应的标记或判断,也可能是输出一段内容——图片、程序代码、文本、声音,而机器自己学到的内容我们可以描述为一个函数、一段程序、一组策略等相对复杂的关系描述。
IT阅读排行榜
2018/08/13
1.2K0
人人都能看懂的机器学习!3个案例详解聚类、回归、分类算法
《算法竞赛进阶指南》0x08 总结与练习
任何问题都有其涉及的范围,称之为问题的“状态空间”,求解一个问题,就是在这个状态空间里的遍历与映射
一只野生彩色铅笔
2022/10/31
8080
《算法竞赛进阶指南》0x08 总结与练习
Java 开源 SPL 横空出世!
现代Java应用架构越来越强调数据存储和处理分离,以获得更好的可维护性、可扩展性以及可移植性,比如火热的微服务就是一种典型。这种架构通常要求业务逻辑要在Java程序中实现,而不是像传统应用架构中放在数据库中。
Java技术栈
2021/12/29
7890
全栈软件测试工程师宝典连载(6)
性能测试在质量ISO2510 2006模型中属于效率,根据维基百科定义,[30]软件性能测试作为软件质量保证必不可少的环节,指的是软件系统或构件对于其及时性要求符合程度的指标;它是一种规范,可以用来量化更改业务指标所产生的影响,进而说明部署软件的风险。一般用响应时间|、QTP、吞吐率、每秒点击数等参数指标进行衡量。
顾翔
2021/01/18
5020
从 jsonpath 和 xpath 到 SPL
        XML和Json不仅是结构化文本,而且擅长表示多层数据,可承载足够通用和足够丰富的信息,因此常被用于各种数据交换和信息传递事务,比如WebService/Restful,微服务等。但多层数据要比传统的二维表结构复杂,取数后再处理的难度也大。
大数据梦想家
2022/09/09
2.2K0
从 jsonpath 和 xpath 到 SPL
开源SPL助力JAVA处理公共数据文件(txt/csv/json/xml/xsl)
在 JAVA 应用中经常要处理 txt\csv\json\xml\xls 这类公共格式的数据文件,直接用 JAVA 硬写会非常麻烦,通常要借助一些现成的开源包,但这些开源包也都有各自的不足。
石臻臻的杂货铺[同名公众号]
2022/06/14
1.3K0
开源SPL助力JAVA处理公共数据文件(txt/csv/json/xml/xsl)
原创 | 平面内有N个点,如何快速求出距离最近的点对?
这个问题经常在各种面试当中出现,难度不低,很少有人能答上来。说实话,我也被问过,因为毫无准备,所以也没有答上来。是的,这道题有点神奇,没有准备的人往往答不上来。
TechFlow-承志
2020/10/27
3.9K0
原创 | 平面内有N个点,如何快速求出距离最近的点对?
相关推荐
一种能让大型数据聚类快2000倍的方法,真不戳
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档