同行分析優化

2022-03-26 04:27:16 字數 2626 閱讀 4264

優化源於痛點(┬_┬)

有沒有痛點取決於業務場景的需求;有多痛取決於當前方案對業務的契合度

讓我們從業務場景①、當前方案②切入,聯立①②來推導當前痛點③吧!

話不多說,開始分析

①業務場景:

1.同一時間段內出現在同一攝像頭下的使用者即為同行關係(不需要兩個人同步出現在攝像頭下,因為我司暫不支援在一張內一次性提取兩個人,處理邏輯太麻煩了,還不如後面分析)

2.計算需要並行進行,每次計算一天的資料量,大約千萬級

②當前方案:

將全部資料拉到記憶體,全域性排序後按照時間段大小分塊,然後通過滑動視窗進行計算,比如說時間段是10s,20.11.00到20.11.10為乙個視窗,20.11.10到20.11.20為乙個視窗,20.11.20到20.11.30為乙個視窗,同一視窗直接判定同行,相鄰視窗間需要計算確定是否同行,計算後還要每兩個視窗之間去重

③當前痛點:

1.千萬級資料拉到記憶體,會對記憶體造成一定壓力,因為並不是只有這乙個服務需要使用記憶體

2.計算過程大量重複,去重邏輯繁瑣,浪費大量算力

那麼問題來了,是否存在什麼更合適的方案來解決這些痛點呢?

我想,是有的。

根據痛點③,反推我們的預期目標④;

根據目標④,嘗試推導出優化思路⑤;

落地思路⑤,成為最終的優化方案⑥

④預期目標

1.不佔記憶體

2.避免重複計算,一鍵去重

⑤優化思路

1.不把資料全拉到記憶體全域性排序就不會造成記憶體壓力,所以我們直接在sql裡dd分好片就行了

2.從數學上邏輯推導來解決重複計算問題,參考裂項相消法的思路

⑥優化方案

test:原表,儲存需要計算的資料

①假定取一天資料,劃分時間段是10s,我們可以把一天分成8640個塊,然後按塊處理。這些塊就是我們需要的分塊,不需要做排序再切片什麼的

with source as(

select

id,floor(unix_timestamp(time)/10) as time_part,

unix_timestamp(time)as time

from test

)

②假定有四個塊,1234,那麼我們需要計算的其實是相鄰的塊之間的時間差,也就是1和2,2和3,3和4,其他的11,22,33,44都直接就是我們需要的結果,把這些返回結果加起來,就是我們需要的答案。我們把資料複製乙份,第乙份是原本的1234,第二份-1變成0123,然後按塊join,就能得到11(原本的2,即12),22(原本的3,即23),33(原本的4,即34),第乙份再和自己join,就能得到11,22,33,44,加起來就是11,22,33,44,12,23,34,即我們需要的所有結果

with source as (

select

id,floor(unix_timestamp(time)/10) as time_part,

unix_timestamp(time)as time

from test

),target as (

select

id,alias.time_part,

time

from source

lateral view explode(split(concat(time_part-1,',',time_part),',')) alias

as time_part

)

上述操作其實是一步到位,把所有資料塊平移了乙個單位然後和原本的資料庫union了,a實現方式為explode,alisas是別名。通過這種方式我們能直接得到需要計算的所有資料

③配對,計算

with source as (

select

id,floor(unix_timestamp(time)/10) as time_part,

unix_timestamp(time)as time

from test

),target as (

select

id,alias.time_part,

time

from source

lateral view explode(split(concat(time_part-1,',',time_part),',')) alias

as time_part

)select id from

source join target

on source.time_part=target.time_part

where abs(source.time-target.time)<10

以上就是我的優化方案,所有sql均在spark.sql中執行,優點如下:

1.資料庫內直接分好塊,不佔記憶體,來再多資料也沒影響

2.完美解決邊界點問題,沒有任何遺漏計算也沒有任何重複計算

3.具備可延展性,可以輕鬆把邏輯延展到多維空間

以上就是本次優化從思考到實現的全過程啦,希望大家喜歡(≧▽≦)

Effective C 編譯器同行優化

author processwidget std tr1 shared ptr new widget priority 編譯器會把上面的語句分成三個步驟 但是編譯器用什麼順序來執行這三個步驟,彈性很大 如果像如下的順序 如果第二步 priority 發生異常。那麼widget就不會被釋放。這就是說可...

六大SEO優化策略助你超越同行

隨著目前做seo優化的朋友原來越多,導致很多沒有完全掌握seo技術的朋友感到苦惱,經常會聽到現在seo越來越不好做了的話,正因為做的人數多,導致seo優化競爭的難度加大,幾年前大多數人都不懂seo,加上搜尋引擎演算法並不是很完www.cppcns.com善,發布一些外鏈更新一些文章就能做好排名,而現...

例解 如何分析同行評審的度量資料?

在進行同行評審時,一般可以積累如下的度量資料 1 評審文件或 的規模 對於需求文件的規模一般是採用頁或功能點為度量單位 對於測試用例的規模一般是採用個或頁為度量單位 對 的規模一般是採用行為度量單位 對於設計或其他文件一般是採用頁為度量單位。2 個人評審的時間週期,計量單位為小時 3 評審會議的時間...