背景:
某场景中需要多次运算与外部交互,要求每次运算的时间尽可能少。当前使用的运算方法为spark 内存运算将大量数据加载到集群内存中,按行计算。
实际上,这些数据是按某一种类别区分的,可以按类别组织成一个一个张量,通过矩阵运算来实现快速计算。
(小区切换)
核心:快速读,快速算,一些可以提前算的提前算好
结果:比spark2.5快了30%
实现方法:
1、常用的矩阵运算一般为numpy来实现。因此以python作为主要语言。通过多进程来实现不同类别的区分。
2、不同的外部参数也矩阵化便于矩阵运算。整体抽象出13个矩阵(每个类别),类别中数据量较大时,矩阵会比较大。
3、多个矩阵之间串行计算,包括求和,求积,按行求最大值等操作。并引入爱因斯坦求和公式进行加速。
4、通过python共享内存提前把数据加载好,在多进程使用的时候通过数据索引定位到数据取出计算。
5、把每个进程的结果合并到一起返回
6、通过pandas等做一些整合分类等交互
瓶颈所在:
1、python语言本身是相对比较慢的,会吃掉矩阵运算的收益;
2、不同进程中的数据量不一,数据量最大的类别会拖慢整个计算进度。
3、多进程使用时,不要从外部传入数据,序列化和反序列化会消耗很多时间。
4、拿到多进程结果后,一些结果会需要pandas做一些运算,如数据分类等,耗时比numpy多。
5、ray并行框架并未真正提升速度
使用的算法参考
1、爱因斯坦求和公式https://zhuanlan.zhihu.com/p/476279989
2、python共享内存https://zhuanlan.zhihu.com/p/146769255?utm_source=wechat_session
3、ray框架https://blog.csdn.net/u012925804/article/details/128040276