常用的排序演算法插入排序、選擇排序和快速排序等都是將資料取到記憶體中進行排序。當資料量非常大時,大到記憶體無法一次將所有資料讀到記憶體中,這時就需要使用外部排序。
基本思想:
步驟一:
步驟二:
// 將檔案讀取的資料輸送到乙個節點
// 該節點通過goroutine將資料輸送到chan
func
readersource
(a ...int)
<-chan
int
// 一定要close,close後,外面會用if或range取判斷取失敗
// 資料量大的話,不關閉會很佔記憶體
close(out)
}()return out
}複製**
// 將上面readersource返回的chan傳進來讀入記憶體
// 使用內部排序對讀入記憶體的資料排序
// 然後通過goroutine輸出到chan返回出去
// 引數in 只進不出,返回引數只出不進
func
inmemsort
(in <-chan
int)
<-chan
int
for v := range in
// sort
sort.ints(a)
// output
for _, v := range a
// close
close(out)
}()return out
}複製**
// 將排好序的記憶體資料列印輸出,或者存檔案
func
main()
}複製**
// 將排好序的多個節點通過2路歸併排序
func
mergen
(inputs ... <-chan
int)
<-chan
int
m := len(inputs) / 2
// merge inputs[0...m) and inputs [m...end)
return merge(mergen(inputs[:m]...), mergen(inputs[m:]...))
}複製**
// 將排好序的2個節點歸併歸併
func
merge
(in1, in2 <-chan
int)
<-chan
int else
} // 關閉
close(out)
fmt.println("merge done: ", time.now().sub(starttime))
}()return out
}複製**
R語言 並行處理
最新更新參考 具體的不懂,只記錄實現 r自帶的包,可以實現並行處理。library parallel detectcores logical f 獲得實際核數 cl makecluster getoption cl.cores 4 設定並行核數為4 clusterexport cl cl,varli...
go語言 並行程式 wordcount
go在設計的時候,就有針對並行的語法 channel 和goroutine 前者 可以很方便的進行訊息和資料傳遞,在取資料和拿資料的時候可以不用關心底層實現,用 進行賦值 這裡必須加time.sleep 不然程式很快就結束,read 和 write 甚至都來不及執行。這裡和linux 執行緒程式設計...
Go語言的管道Channel用法
channel 是有型別的管道,可以用 channel 操作符 ch v 箭頭 就是資料流的方向。和 map 與 slice 一樣,channel 使用前必須建立 ch make chan int 預設情況下,在另一端準備好之前,傳送和接收都會阻塞。這使得 goroutine 可以在沒有明確的鎖或競...