精慕门0323489
慕姐1501452
慕姐1501452
Hataketed
yingxuegu
慕婉清4481398
":="是声明并初始化变量,[]int是类型,{}是给a赋的初始值
慕仔9271372
拧壶冲
1B(Byte 字节)=8bit(位)
uint64(无符号64位整数)=64bit=8Byte
程序中读写都是讲一个uint64转成8Byte然后按字节读写
分4块读取:每次读取8Byte,每块大于等于100B才结束,最后每块读取了13个uint64,排序后写入文件52个uint64共512Byte
拧壶冲
qq_蒙牛_0
可以将`pipelient.ReadSource`的参数改成`io.ReadCloser`, 然后在文件数据读完的地方close就行
weixin_慕瓜4465165
慕妹2184772
啊哈23
seth-shi
不会,channl都是在等待接收。如果in1延时,可以会引像归并的结果。
YogurtJ
Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序
果香满园
1、channel 是分缓冲通道和非缓冲通道的,在 make channel 的时候,如果没有指定通道容量,那么这就是一个非缓冲通道。
非缓冲通道的特点是,必须发送和接收同时进行,否则就会等待;
而缓冲通道不需要发送和接收同时进行,但是当通道满的时候,发送方也会阻塞,必须等到接收方从通道中拿走数据后才能继续发送。
2、所以上面的代码没有指定容量,是一个非缓冲通道,那么必然是发送和接收同时进行的,也可以理解为 放一个 range 一个。
weixin_慕运维6503109
只要一个类型,实现了一个接口的任意方法,都能隐式转换为该接口类型
可以看下具体的代码
// 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) {
// .......
}
weixin_慕运维6503109
大数据
qq_Cheers_KOPV14
会,已经出了
牙小木
qq_慕九州8383107
可以改,
qq_后半生不后悔_03564220
因为开始已经把in1输入到变量v1了,不更新v1的话,for循环会一直拿到的是v1的第一个值
Kinopio
go语言实战 --> go语言圣经 --> go语言高级编程 柴树杉 / 曹春晖 / 人民邮电出版社
qq_追心_
后面会有,n判断buffer里是否还有数据,之后会对没有的情况做处理
飘荡着呢
如果你单机跑整个程序(你的机器内存8G,但你需要派排序的文件8.5G)这样子会导致程序因为内存空间不足导致panic,因此通过分片(分块)的方法,将大文件分子别在不同的机器上面进行处理,最终再由一个机器分别汇总结果并输出到文件。
Tscheung
解决了,因为多敲了一句out <-a[0], 跟着老师敲没跟着删掉这句话
weixin_慕少9234343
兄弟你这个就离谱
慕工程3002471
把端口调小看,不要用那么大的,不好
慕工程3002471
加了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
慕工程3002471
是覆盖了,覆盖了8个字节,刚好是一个int。然后这个buffer转成int,并由out channel 发送出去