集算器并行处理大文本文件的示例
集算器可以方便地用并行方式處理大文本文件,下面通過一個例子來說明使用方法。
假設有個一千萬條銷售記錄的文本文件sales.txt,其主要字段是SellerID(銷售員)、OrderDate(訂單日期)、Amount(訂單金額),請計算每個銷售員在近四年里的大訂單總金額。其中,金額在2000以上的屬于大訂單。
要進行并行處理,首先要能對文件進行分段,集算器提供了游標數據對象cursor及其函數,可以方便地分段讀取大文本文件。比如file(“e:/sales.txt”).cursor@tz(;,3:24),這表示將文件按字節數大致均分為24段,然后讀取其中第3段。簡單的按字節拆分文件時會產生半行數據即半條記錄的情況,還需要再編程處理才行,而如果按行拆分則需要遍歷前面所有的數據行,完全達不到采用分段并行方案期望的高性能。集算器在拆分文件時自動進行了去頭補尾的工作,保證數據的正確性。
分段后只要進行簡單的并行處理就可以了,代碼如下:
????主程序
? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ?A1:并行任務數設為24,即將文件分為24段。
? ? ?A2:調用子程序進行多線程并行計算,任務參數有兩個:to(A1)、A1。to(A1)的值是[1,2,3…24],這表示每個任務分配到的段數;A1是總段數。所有任務都結束后,計算結果會統一存儲在本單元格。
? ? ?A3:對A2中各任務的計算結果按照SellerId歸并。
? ? ?A4:對歸并結果進行分組匯總,求得每個銷售員的銷售額。
????子程序
?????其中segment和total是子程序的參數,分別表示當前段和總段數,比如第3個任務,segment參數的值就是3,total的值恒為24。
? ? ?A1:用游標讀取文件,按照主程序傳來的參數決定當前任務應該處理文件中的第幾段。
? ? ?A2:選出時間是2011年之后的,訂單金額在2000以上的記錄。
? ? ?A3:對過濾后的數據進行分組匯總。
? ? ?A4:將本任務的計算結果返回主程序。
????代碼說明
?????對于N核CPU,似乎設置為N個任務更加自然,但事實上執行任務時時總會有快有慢(比如過濾出的數據不同),因此常會遇到這種情況:其他核心已經完成了較快的任務,正在空閑等待,而個別核心還在執行較慢的任務。相反,如果每個核心依次執行多個任務,則快慢任務會趨于平均,整體運行會更加穩定。所以上述例子是將任務分為24份,并分給CPU的8個核心進行處理(同時最多允許并行多少個線程可以在集算器的環境中配置)。當然,任務分得太多也會帶來壞處,首先是整體性能會下降,其次是各任務產生的計算結果加起來會更大,會占用更多的內存。
? ? callx將復雜的多線程計算封裝了起來,程序員可以專心于業務算法,而不必糾結于復雜的信號量控制,開發過程變簡單了。
????主程序中A3的計算結果已經按照SellerId自動排序,因此A4的分組匯總不必再排序,groups的函數選項@o可以實現免排序的高效分組匯總。
????擴展:
????有時候文本文件的數據量會達到幾個TB,此時就需要使用基于集群的多節點并行計算。集算器游標及其相關函數支持廉價橫向擴展和分布式文件系統,可以輕松實現并行計算。針對本例,只需要在主程序中的A2格加入節點列表即可,形如:=callx("sub.dfx", to(A1), A1;["192.168.1.200:8281","192.168.1.201:8281",”......”]).
轉載于:https://blog.51cto.com/report5/1563845
總結
以上是生活随笔為你收集整理的集算器并行处理大文本文件的示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Crontab中shell每分钟执行一次
- 下一篇: 在css文件中字体加粗属性为什么