背景:
某場(chǎng)景中需要多次運(yùn)算與外部交互,要求每次運(yùn)算的時(shí)間盡可能少。當(dāng)前使用的運(yùn)算方法為spark 內(nèi)存運(yùn)算將大量數(shù)據(jù)加載到集群內(nèi)存中,按行計(jì)算。
實(shí)際上,這些數(shù)據(jù)是按某一種類別區(qū)分的,可以按類別組織成一個(gè)一個(gè)張量,通過矩陣運(yùn)算來實(shí)現(xiàn)快速計(jì)算。
(小區(qū)切換)
核心:快速讀,快速算,一些可以提前算的提前算好
結(jié)果:比spark2.5快了30%
實(shí)現(xiàn)方法:
1、常用的矩陣運(yùn)算一般為numpy來實(shí)現(xiàn)。因此以python作為主要語言。通過多進(jìn)程來實(shí)現(xiàn)不同類別的區(qū)分。
2、不同的外部參數(shù)也矩陣化便于矩陣運(yùn)算。整體抽象出13個(gè)矩陣(每個(gè)類別),類別中數(shù)據(jù)量較大時(shí),矩陣會(huì)比較大。
3、多個(gè)矩陣之間串行計(jì)算,包括求和,求積,按行求最大值等操作。并引入愛因斯坦求和公式進(jìn)行加速。
4、通過python共享內(nèi)存提前把數(shù)據(jù)加載好,在多進(jìn)程使用的時(shí)候通過數(shù)據(jù)索引定位到數(shù)據(jù)取出計(jì)算。
5、把每個(gè)進(jìn)程的結(jié)果合并到一起返回
6、通過pandas等做一些整合分類等交互
瓶頸所在:
1、python語言本身是相對(duì)比較慢的,會(huì)吃掉矩陣運(yùn)算的收益;
2、不同進(jìn)程中的數(shù)據(jù)量不一,數(shù)據(jù)量最大的類別會(huì)拖慢整個(gè)計(jì)算進(jìn)度。
3、多進(jìn)程使用時(shí),不要從外部傳入數(shù)據(jù),序列化和反序列化會(huì)消耗很多時(shí)間。
4、拿到多進(jìn)程結(jié)果后,一些結(jié)果會(huì)需要pandas做一些運(yùn)算,如數(shù)據(jù)分類等,耗時(shí)比numpy多。
5、ray并行框架并未真正提升速度
使用的算法參考
1、愛因斯坦求和公式https://zhuanlan.zhihu.com/p/476279989
2、python共享內(nèi)存https://zhuanlan.zhihu.com/p/146769255?utm_source=wechat_session
3、ray框架https://blog.csdn.net/u012925804/article/details/128040276
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。