用多執行緒實現查詢過濾和分組彙總的思路是:採用多執行緒方式,每個執行緒處理一部分資料的查詢過濾和分組彙總,最後將每一部分檢索的結果合併分組彙總,再在主程式中完成最終的過濾。這裡通過乙個例子來看一下具體做法。
考慮到大資料一般都儲存在檔案中,這裡也以
orders.b
檔案為例,資料如下:
orderid client sellerid amount orderdate note
1 287 47 5825 2013-05-31 gafcaghafdgie f ci…
2 89 22 8681 2013-05-04 gafcaghafdgie f ci…
3 47 67 7702 2009-11-22 gafcaghafdgie f ci…
4 76 85 8717 2011-12-13 gafcaghafdgie f ci…
5 307 81 8003 2008-06-01 gafcaghafdgie f ci…
6 366 39 6948 2009-09-25 gafcaghafdgie f ci…
7 295 8 1419 2013-11-11 gafcaghafdgie f ci…
8 496 35 6018 2011-02-18 gafcaghafdgie f ci…
9 273 37 9255 2011-05-04 gafcaghafdgie f ci…
10 212 0 2155 2009-03-22 gafcaghafdgie f ci… …
說明:資料中
note
欄位是為了增加每條記錄的長度設定的字段,沒有實際意義。
需要將2013
年的訂單記錄按照
client,sellerid
分組,並求訂單數量
count(orderid)
和訂單金額
sum(amount)
。最後,按照訂單金額大於
500000
的條件過濾結果。
由於orders.b
的資料量較大,所以分成若干段並行處理。首先,要使用集算器來編寫指令碼
group.dfx
,實現多執行緒計算,具體指令碼如下:
a1:並行彙總執行緒數為4。
a2:通過fork
關鍵字,使用多執行緒執行b2到
b5的**,執行緒數是
4,每個執行緒讀取到的
a2值分別是1、
2、3、
4。 b
2:利用游標
cursor
函式,將檔案大致分成
4組,取其中第
a2組的游標(只取需要的字段)。
b3:按照年份
=2013
年查詢過濾。
b4:對游標進行分組彙總。
b5:返回本執行緒的分組結果b4。
a6:在主線程中把四個執行緒的返回結果合併。
a7:對合併之後的結果再做一次分組彙總。
a8:按照訂單金額大於
500000
過濾分組之後的結果。
a8,向外部程式返回最終彙總結果。
集算器指令碼完成之後儲存為
group.dfx
,在外部程式中通過集算器
jdbc
呼叫group.dfx
的方法參見集算器的教程。
採用集算器多執行緒查詢過濾方案的效能測試資料,可參見集算器檔案遍歷計算的效能測試。
map分組計算的各種計算
實體類 public class user 1,跟據某個屬性 name 分組 map collectname users.stream collect collectors.groupingby user getname system.out.println collectname 2,根據某個屬性...
Delphi 的平行計算
所謂平行計算,可以讓一段 讓 cpu 的多個核同時開跑,非常明顯地提高 執行速度。所謂 程式 這個中文單詞,嚴格意義上來說,就是按照特定順序,一步一步地執行一些指令。這是標準的序列計算。序列計算的好處是有上下文依賴關係的事情,不會搞錯順序。好比先洗碗,再打飯,程式這樣寫了,計算機絕對不會搞錯成先打了...
Tensorflow的平行計算
每個gpu上的模型相同,喂以相同模型不同的訓練樣本。資料並行根據引數更新方式的不同又可以分為同步資料並行和非同步資料並行。每個gpu根據loss計算各自的gradient,彙總所有gpu的gradient,求平均梯度,根據平均梯度更新模型引數,具體過程見下圖。所以同步資料並行的速度取決於最慢的gpu...