集算器實現外存排序的代碼示例

在數據分析計算中,將表中的記錄排序,是很常見的需求。集算器中,可以用sort函數爲序列或者序表中的數據排序。如果需要排序的數據量巨大,就不能一次將它們讀入內存,這樣普通的排序方法就無法執行了,此時需要使用外存排序。

 

如,文本文件Order_Foods.txt中,存儲了50,000條食品的訂單信息:



 

現在,需要將訂單中的數據按照以下要求排序:

1、按照食品名稱升序排序;

2、按照訂單日期升序排序,日期相同的按照食品名稱降序排序;

3、先按照訂單日期降序排序,日期相同的按照訂單金額降序排序。

 

 

在這裏50,000條數據並不算很多,我們只是以此爲例瞭解一下如何爲大數據排序。在實際應用中,可能會遇到幾億條記錄,或者幾十上百G的數據文件。

在集算器中,遇到大數據時,需要使用遊標來計算,數據表中的記錄不會一次全部讀出,而是按照設定每次讀取一條或多條記錄,這就可以避免數據計算時的內存溢出。但是,由於每次讀取的都只是部分數據,如果需要對遊標中的所有數據進行排序、分組等計算時,是無法直接完成的。集算器中的cs.sortx(x…;n)函數,可以利用外存,根據設定的緩衝區行數n來將遊標內的數據逐步讀出,分別處理並存儲在外存文件中,以避免內存溢出。遊標排序的結果仍然是一個遊標,讀取數據的方法和普通的遊標完全相同。

 

下面我們看一下如何對Order_Foods.txt中的數據完成排序:



 

A2中,用文本文件Order_Foods.txt生成遊標,用第一行作爲列名。A3中使用sortx函數,將A2遊標中的數據按照食品名稱升序排序。排序時,設定了緩衝區行數是1000,這樣每讀出1000條記錄就排序1次,將結果存爲1個臨時外存文件,排序完成的結果是一個遊標:



 

在用這個遊標取數時,將自動將生成的所有外存文件歸併,讀取出所需數據。如A4中讀出了排序後的前1000條記錄如下:



 

 

A5中將遊標關閉後,剛剛排序時產生的外存文件都會自動清除。由於A3中的遊標是由A2中游標生成的,因此A3中的遊標關閉之後,A2中的遊標也會關閉。如果需要計算按訂單日期升序排序再按照食品名稱降序排序的結果,需要在A6中重新生成遊標。如果需要了解更多關於大數據排序的情況,請參閱http://blog.raqsoft.cn/?p=3063 。

A7中按需要將遊標中的數據外存排序。sortx函數中,可以指定多個排序字段或排序表達式,如果某個表達式需要降序排序,需要在排序表達式前添加負號。A7中的排序結果同樣是遊標:



 

這一次,先在A8中跳過20,000條記錄,再在A9中讀出排序後的第20,001~21,000條數據如下:



 

遊標使用完畢後,需要在A10中將其關閉,這樣才能即時清理外存文件。如果遊標中的數據全部讀完,則會自動關閉,不必再調用cs.close()命令。

在排序表達式前加負號來執行降序排序的方法,不僅適用於A7中的字符類型數據,也適用於日期類型或者數值類型。在A12中執行降序排序時,分別使用了日期類型字段和數值類型字段,A13中讀取了排序後數據的前1000條記錄如下:



 

 

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