-
Go语言编程范式:面向接口、函数式编程、并发编程。
查看全部 -
各个编程语言的使用场景.
查看全部 -
外部排序pipeline
查看全部 -
节点的组装,
传统语言与Go语言 对比
查看全部 -
go run [file] go build [file] [bin]
查看全部 -
网络的扩展
查看全部 -
网络的扩展
查看全部 -
单机版外部排序 pipeline
Reader Source 节点-支持分块
Mergen-搭建归并节点组
pipeline 的搭建及运行——CPU 及线程数量的观测
查看全部 -
package main
import (
"bufio"
"ccmouse/gointro/pipeline"
"fmt"
"os"
)
func main() {
p := createPipeline("small.in", 512, 4)
writeToFile(p, "small.out")
printFile("small.out")
}
func printFile(filename string) {
file, err := os.Open(filename)
if err != nil {
panic(err)
}
defer file.Close()
p := pipeline.ReadSource(file, -1)
for v := range p {
fmt.Println(v)
}
}
func writeToFile(p <-chan int, filename string) {
file, err := os.Create(filename)
if err != nil {
panic(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
defer writer.Flush()
pipeline.WriteSink(writer, p)
}
func createPipeline(
filename string,
filesize, chunkCount int) <-chan int {
chunkSize := filesize / chunkCount
var sortResults []<-chan int
for i := 0; i < chunkCount; i++ {
file, err := os.Open(filename)
if err != nil {
panic(err)
}
file.Seek(int64(i * chunkSize), 0)
source := pipeline.ReadSource(
bufio.NewReader(file), chunkSize)
sortResults = append(sortResults, pipeline.InMemSort(source))
}
return pipeline.MergeN(sortResults...)
}查看全部 -
package pipeline import ( "encoding/binary" "io" "sort" ) func ArraySource(a ...int) <-chan int { out := make(chan int) go func() { for _, v := range a{ out <- v } close(out) }() return out } func InMemSort(in <-chan int) <-chan int { out := make(chan int) go func() { // Read into memory var a []int for v := range in { a = append(a, v) } // Sort sort.Ints(a) // Output for _, v := range a { out <- v } close(out) }() return out } func Merge(in1, in2 <-chan int) <-chan int { out := make(chan int) go func() { v1, ok1 := <-in1 v2, ok2 := <-in2 for ok1 || ok2 { if !ok2 || (ok1 && v1 <= v2) { out <- v1 v1, ok1 = <-in1 } else { out <- v2 v2, ok2 = <-in2 } } close(out) }() return out }
package main import ( "ccmouse/gointro/pipeline" "fmt" ) func main() { p := pipeline.Merge( pipeline.InMemSort( pipeline.ArraySource(3, 2, 6, 7, 4)), pipeline.InMemSort( pipeline.ArraySource(7, 4, 0, 3, 2, 13, 8))) for v := range p { fmt.Println(v) } }
查看全部 -
一些节点
数组数据源节点- channel 的关闭及检测
内部排序节点
归并节点
查看全部 -
外部排序 Pipeline
查看全部 -
节点的组装
查看全部 -
节点多输入和多输出
查看全部 -
Pipeline
查看全部
举报
0/150
提交
取消