文件計算的並行查找與過濾

   潤乾集算器具備文件計算能力。對於數據量相對較大的情況,集算器提供了多線程並行的功能,可以充分利用計算機的多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的性能較好。數據量大於可用內存時,集算器性能常常會超出。

  上述方式是採用單機並行來提高計算性能。對於數據量更大的情況,也可以考慮採用集算服務器集羣的方式,利用多機並行來進一步提升性能。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章