(17)利用矩阵运算做加速

背景:

    某场景中需要多次运算与外部交互,要求每次运算的时间尽可能少。当前使用的运算方法为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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容