遞歸數(shù)據(jù)效率低怎么辦?用并行計算!
對于比較復雜的互聯(lián)網(wǎng)應用業(yè)務場景,比如海量數(shù)據(jù)商品搜索、廣告點擊算法、用戶行為挖掘、關(guān)聯(lián)推薦模型等等,由于數(shù)據(jù)量極大,對于數(shù)據(jù)處理的速度會要求非常高。要大幅提升算法的效率,最直接的方法就是:使用并行計算。
但是,并行計算有一個很大的問題:傳統(tǒng)的程序都是基于單機編寫的。要更改為多機并行的程序,需要耗費較大的學習成本。尤其在真實的場景當中,業(yè)務本身很復雜,初學者一頭扎進去,容易繞暈了頭。
因此,我們需要一個通俗易懂的例子來直接看到并行計算的優(yōu)勢。
下面,淘寶網(wǎng)高級專家千峰就編寫了這樣的一個例子,51CTO受邀將這篇文章分享給大家。
文章概述
問題:
請寫一個程序,輸入M,然后打印出M個數(shù)字的所有排列組合(每個數(shù)字為1,2,3,4中的一個)。比如:M=3,輸出:
1,1,1 1,1,2 …… 4,4,4
共64個
注意:這里是使用計算機遍歷出所有排列組合,而不是求總數(shù),如果只求總數(shù),可以直接利用數(shù)學公式進行計算了。
傳統(tǒng)的單機解決方案:
1)單機遞歸
將n(1<=n<=4)看做深度,輸入的m看做廣度。當m數(shù)字很大時,會超出單臺機器的計算局限導致緩慢。
2)單機迭代
求m個數(shù)字的排列組合,實際上都可以在m-1的結(jié)果基礎(chǔ)上得到。但是,當m=14的時候,結(jié)果已經(jīng)上億了。無論以什么格式存,最終在單機上都會內(nèi)存溢出。
分布式并行計算解決方案:
1)多機遞歸
這是本篇文章的重點。
核心思想:重新設(shè)計算法,按多機進行拆分和合并,利用并行計算優(yōu)勢去完成結(jié)果。
按照并行計算的算法,n臺計算機可以將遞歸降一級,n*n臺計算機可以將遞歸降兩級。理論上,只要機器足夠多,就能持續(xù)降低遞歸的復雜度。
運行步驟:
使用fourinone框架設(shè)計分布式并行計算。整個框架通過一個ParkServerDemo做整體的工人注冊和分布式協(xié)調(diào),中間有作為包工頭的CombCtor(分配工作+統(tǒng)計結(jié)果),最下面有多個CombWorker作為工人實現(xiàn)(干活兒+返回結(jié)果)。
文中有多機遞歸實現(xiàn)的完整代碼。
2)多機迭代
本文提供了三個多機迭代的思路。相對多機遞歸的方式,多機迭代的方式在這個例子中并不高效,因此沒有提出實現(xiàn)方式。