":="是声明并初始化变量,[]int是类型,{}是给a赋的初始值
1B(Byte 字节)=8bit(位)
uint64(无符号64位整数)=64bit=8Byte
程序中读写都是讲一个uint64转成8Byte然后按字节读写
分4块读取:每次读取8Byte,每块大于等于100B才结束,最后每块读取了13个uint64,排序后写入文件52个uint64共512Byte
可以将`pipelient.ReadSource`的参数改成`io.ReadCloser`, 然后在文件数据读完的地方close就行
不会,channl都是在等待接收。如果in1延时,可以会引像归并的结果。
Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序
1、channel 是分缓冲通道和非缓冲通道的,在 make channel 的时候,如果没有指定通道容量,那么这就是一个非缓冲通道。
非缓冲通道的特点是,必须发送和接收同时进行,否则就会等待;
而缓冲通道不需要发送和接收同时进行,但是当通道满的时候,发送方也会阻塞,必须等到接收方从通道中拿走数据后才能继续发送。
2、所以上面的代码没有指定容量,是一个非缓冲通道,那么必然是发送和接收同时进行的,也可以理解为 放一个 range 一个。
只要一个类型,实现了一个接口的任意方法,都能隐式转换为该接口类型 可以看下具体的代码 // io.go // io.Writer 接口定义 type Writer interface { Write(p []byte) (n int, err error) } // file.go // File结构体write方法 func (f *File) Write(b []byte) (n int, err error) { // ....... }
大数据
会,已经出了
可以改,
因为开始已经把in1输入到变量v1了,不更新v1的话,for循环会一直拿到的是v1的第一个值
go语言实战 --> go语言圣经 --> go语言高级编程 柴树杉 / 曹春晖 / 人民邮电出版社
后面会有,n判断buffer里是否还有数据,之后会对没有的情况做处理
如果你单机跑整个程序(你的机器内存8G,但你需要派排序的文件8.5G)这样子会导致程序因为内存空间不足导致panic,因此通过分片(分块)的方法,将大文件分子别在不同的机器上面进行处理,最终再由一个机器分别汇总结果并输出到文件。
解决了,因为多敲了一句out <-a[0], 跟着老师敲没跟着删掉这句话
兄弟你这个就离谱
把端口调小看,不要用那么大的,不好
加了buffer优化以后
Read done: 5.3912809sRead done: 5.4942484sRead done: 5.5322359sRead done: 5.6811895sInMemSort done: 12.5876798sInMemSort done: 12.734652sInMemSort done: 12.7486486sInMemSort done: 12.8836605sMerge done: 37.1819834sMerge done: 37.1819834sMerge done: 37.1819834s
是覆盖了,覆盖了8个字节,刚好是一个int。然后这个buffer转成int,并由out channel 发送出去