集算器可以方便地用並行方式處理大文字檔案,下面通過乙個例子來說明使用方法。
假設有個一千萬條銷售記錄的文字檔案
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...