潤乾集算器具備文件計算能力。對於數據量相對較大的情況,集算器提供了多線程並行的功能,可以充分利用計算機的多CPU多核的計算能力,獲得接近或超過傳統數據庫的計算性能。
這裏只考慮小結果集的情況,即數據計算結果在內存可以裝下的情況。
集算器多線程並行結構示意圖如下:
如上圖所示,集算器通過一個主腳本將任務分配給多個子腳本,每個子腳本分別訪問本地數據的一部分進行計算。子腳本都完成計算後,將結果返回給主腳本,完成計算後提交給宿主程序(如報表工具)。
每個子腳本就是一個線程。理論上說服務器對多線程並行任務的支持取決於CPU核數和硬盤並行性能。服務器的CPU核數越多、硬盤的並行讀取能力越強,可以同時運行的線程數越多,總任務完成的越快。因此,多線程並行任務功能可以充分發揮計算機的計算能力。
用多線程實現查找過濾的思路是:採用多線程方式,每個線程處理一部分數據的檢索,最後將每一部分檢索的結果合併。這裏通過一個例子來看一下具體做法。考慮到大數據一般都存儲在文件中,這裏也以Orders.txt文件爲例,數據如下:
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字段是爲了增加每條記錄的長度設置的字段,沒有實際意義。
需要按照條件“sellerid=1並且client=50並且orderdate在2013之後”檢索過濾後提交給外部Java程序。
由於Orders.txt的數據量較大,所以分成若干段並行處理。首先,要使用集算器來編寫腳本select.dfx,實現多線程並行檢索,具體腳本如下:
A1:並行線程數爲4。
A2:通過fork關鍵字,使用多線程執行B2到B4的代碼,線程數是4,每個線程讀取到的A2值分別是1、2、3、4。
B2:利用遊標cursor函數,將文件大致分成4組,取其中第A2組的遊標(只取需要的字段)。
B3:對遊標進行過濾。
B4:返回本線程的過濾結果B4。
A5:在主線程中把四個線程的返回結果合併。
A6:向外部程序返回最終結果。
集算器腳本完成之後保存爲selec.dfx,在外部程序中通過集算器JDBC調用select.dfx的方法參見集算器的教程。
如果提前將文本文件轉換爲集算器提供的二進制格式,性能會進一步提升。轉換代碼爲:
A1:新建一個文本文件的遊標。
A2:將文本文件的遊標輸出爲二進制文件。
將select.dfx修改如下:
可以看到僅B2的cursor參數改爲@bz,讀取二進制文件,其他腳本沒有變。
在相同的硬件條件下,同樣是3.4G數據,4線程並行,採用普通文本文件完成上述查找過濾需要24秒,採用二進制文件只需要4秒。
採用集算器多線程查找過濾方案的性能測試數據,參見《集算器文件遍歷計算的性能測試》。通過測試並與Oracle對比發現,當數據量小於可用內存時,Oracle的性能較好。數據量大於可用內存時,集算器性能常常會超出。
上述方式是採用單機並行來提高計算性能。對於數據量更大的情況,也可以考慮採用集算服務器集羣的方式,利用多機並行來進一步提升性能。