並行處理大文字檔案

2021-08-27 20:12:37 字數 2062 閱讀 7484

集算器可以方便地用並行方式處理大文字檔案,下面通過乙個例子來說明使用方法。

假設有個一千萬條銷售記錄的文字檔案

sales.txt

,其主要欄位是

sellerid

(銷售員)、

orderdate

(訂單日期)、

amount

(訂單金額),請計算每個銷售員在近四年裡的大訂單總金額。其中,金額在

2000

以上的屬於大訂單。

要進行並行處理,首先要能對檔案進行分段,集算器提供了游標資料物件

cursor

及其函式,可以方便地分段讀取大文字檔案。比如

file(「e:/sales.txt」).cursor@tz(;, 3:24)

,這表示將檔案按位元組數大致均分為

24段,然後讀取其中第

3段。簡單的按位元組拆分檔案時會產生半行資料即半條記錄的情況,還需要再程式設計處理才行,而如果按行拆分則需要遍歷前面所有的資料行,完全達不到採用分段並行方案期望的高效能。集算器在拆分檔案時自動進行了去頭補尾的工作,保證資料的正確性。

分段後只要進行簡單的並行處理就可以了,**如下:

主程式

a1:並行任務數設為

24,即將檔案分為

24段。

a2:進行多執行緒平行計算,任務是

to(a1)

,其是[1,2,3…24]

,這表示每個任務分配到的段數。所有任務都結束後,計算結果會統一儲存在本單元格。

b2-b5

是執行緒內**。

b2:用游標讀取檔案,按照主線程傳來的引數決定當前任務應該處理檔案中的第幾段。

b3:選出時間是

2011

年之後的,訂單金額在

2000

以上的記錄。

b4:對本段資料分組彙總。

b5:將本執行緒的計算結果返回主線程單元格,即a2。

a6:對

a2中各任務的計算結果歸併,部分資料如下:

a7:對歸併結果再進行分組彙總,求得每個銷售員的銷售額,如下:

**說明對於n

核cpu

,似乎設定為

n個任務更加自然,但事實上執行任務時時總會有快有慢(比如過濾出的資料不同),因此常會遇到這種情況:其他核心已經完成了較快的任務,正在空閒等待,而個別核心還在執行較慢的任務。相反,如果每個核心依次執行多個任務,則快慢任務會趨於平均,整體執行會更加穩定。所以上述例子是將任務分為

24份,並分給

cpu的

8個核心進行處理(同時最多允許並行多少個執行緒可以在集算器的環境中配置)。當然,任務分得太多也會帶來壞處,首先是整體效能會下降,其次是各任務產生的計算結果加起來會更大,會占用更多的記憶體。

fork

將複雜的多執行緒計算封裝了起來,程式設計師可以專心於業務演算法,而不必糾結於複雜的訊號量控制,開發過程變簡單了。

主程式中

a6的計算結果已經按照

sellerid

自動排序,因此

a7的分組彙總不必再排序,

groups

的函式選項

@o可以實現免排序的高效分組彙總。

擴充套件:

有時候文字檔案的資料量會達到幾個

tb,此時就需要使用基於集群的多節點平行計算。集算器游標及其相關函式支援廉價橫向擴充套件和分布式檔案系統,可以輕鬆實現平行計算。**形如:

=callx("sub.dfx", to(a1), a1; ["192.168.1.200:8281","192.168.1.201:8281",」......」])

,具體用法參考相關文件。

C 處理文字檔案

文字檔案是一種常用的檔案格式,所以如何處理文字檔案也就成為程式設計的乙個重點。本文就來 一下用c 是如何來處理文字檔案。其內容重點就是如何讀取文字檔案內容 如何改變文字檔案的內容,以及如何用c 來實現對讀取後的文字檔案的列印預覽和列印。一 本文程式設計和執行的軟體環境 1 微軟公司視窗2000伺服器...

C 處理文字檔案

文字檔案是一種常用的檔案格式,所以如何處理文字檔案也就成為程式設計的乙個重點。本文就來 一下用c 是如何來處理文字檔案。其內容重點就是如何讀取文字檔案內容 如何改變文字檔案的內容,以及如何用c 來實現對讀取後的文字檔案的列印預覽和列印。一 本文程式設計和執行的軟體環境 1 微軟公司視窗2000伺服器...

C 處理文字檔案

文字檔案是一種常用的檔案格式,所以如何處理文字檔案也就成為程式設計的乙個重點。本文就來 一下用c 是如何來處理文字檔案。其內容重點就是如何讀取文字檔案內容 如何改變文字檔案的內容,以及如何用c 來實現對讀取後的文字檔案的列印預覽和列印。1 微軟公司視窗2000伺服器版 2 net framework...