大文本並行計算實現方式

對於大文件的處理,可以充分利用現代計算機的多核CPU,實施多線程並行計算,從而達到提速的目的。然而,要在程序語言中編寫多線程並行程序,並不是一件容易的事。

要並行處理就需要將源文件分段,每個線程處理其中一段。文本文件一般是每一行對應一條記錄,每一行長度不一定相同。所以,不能按行數分段,因爲每次都從頭遍歷,起不到提高性能的目標;若按字節分段則不需要遍歷,但有可能分段點正好落在行的中間,造成一行被拆進兩段,導致數據錯誤。有效的解決辦法是採用自動去頭補尾的字節分段機制,即分段開始點所在的行被捨棄,分段結束點所在的行會被補齊,這樣將確保每一段都由完整的行構成,不會有數據錯誤。另外,還有線程的管理和控制等問題,如果管理不當,則會出現越界的情況。

如果有集算器SPL就簡單多了,它對多線程並行計算進行了封裝,代碼寫起來不僅更短而且更容易理解,這樣在獲得高性能的同時,讓程序員把注意力更多地放在計算的整體邏輯上,而不必糾纏於爲了提高性能而採用的並行細節。用集算器SPL寫出並行計算代碼:

 

A

B

C

1

=file(“data.txt”)

/源文件

2

fork 4

=A1.cursor@t(amount;A2:4)

/分作4段並行,分別建立遊標

3

 

=B2.groups(;sum(amount):am)

/遍歷遊標計算amount之和

4

=A2.conj().sum(am)

/彙總每個線程的結果

文本解析的時間經常比計算要長得多,有時候只要解析能夠並行,計算本身是否並行並不重要。所以SPL對於讀取數據提供了簡單的內置並行選項,如果對數據讀取次序不關心,比如分組、求和運算就不在乎次序,可以更簡單地寫出代碼:

 

A

B

1

=file("orders.txt").cursor@mt()

/@m選項將自動根據系統配置決定並行的線程數量

2

=A1.select(month(Date)==10)

/過濾

3

=A2.groups(ID;sum(COST*WEIGHT):VALUE)

/分組、彙總(串行)

其實還有很多場景需要處理大文本計算,直接用集算器SPL處理會很簡單,感興趣可以參考:SPL結構化文本計算

集算器也是進行文件數據源處理的專業工具,可以方便地進行 TXT、Excel、Xml、Json、CSV、ini 等各種文件數據的混合計算、入庫以及導出等工作。桌面級計算工具,即裝即用,配置簡單,調試功能完善,可設置斷點、單步執行,每步執行結果都可查看。語法簡單,符合人的自然思維,比其他高級開發語言更簡單。請參閱:文件處理的應用場景

集算器還很容易嵌入到Java應用程序中,Java如何調用SPL腳本有使用和獲得它的方法。

關於集算器安裝使用、獲得免費授權和相關技術資料,可以參見如何使用集算器

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