新手问题 用并发读取大文件,怎么保证输出顺序不变?

Nebell · 2018年02月06日 · 最后由 wangxingge 回复于 2018年02月08日 · 360 次阅读

如题

var mmFile, err = mmap.Open(filename)
var size, n = mmFile.Len() / 10, 0
var merr error
var Mutex sync.Mutex
var Wg sync.WaitGroup
var buf = make([]byte, size)
for i := 0; i < mmFile.Len() && io.EOF != merr; i += len(buf) {
    Wg.Add(1)
    go func(off int64) {
        n, merr = mmFile.ReadAt(buf, off)
        Mutex.Lock()
        defer Mutex.Unlock()
        if merr != nil {
            log.Println(merr)
        }
        wFile.Write(buf[:n])
        buf = make([]byte, size)
        Wg.Done()
    }(int64(i))
}

Wg.Wait()

新手求教!!

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

挺好奇,请大牛给分享

为什么我总觉得并发读文件可能会更慢

尝试改了下,用一个数组来记录顺序,不知道是不是满足

var mmFile, err = mmap.Open(filename)
var size, n = mmFile.Len() / 10, 0
var merr error
var Mutex sync.Mutex
var Wg sync.WaitGroup
var buf = make([]byte, size)
var outch = make([]chan []byte,0)
for i := 0; i < mmFile.Len() && io.EOF != merr; i += len(buf) {
    Wg.Add(1)
    c:=make(chan []byte,1)
    outch = append(outch,c)
    go func(off int64,c chan []byte) {
        n, merr = mmFile.ReadAt(buf, off)
        Mutex.Lock()
        defer Mutex.Unlock()
        if merr != nil {
            log.Println(merr)
        }
        // wFile.Write(buf[:n])
        c <- buf
        close(c)
        buf = make([]byte, size)
        Wg.Done()
    }(int64(i),c)
}

for _,v:=range outch{
    wfile.Write(<-v)
}

Wg.Wait()

另外还有个思路,就是从哪个位置读的,就写到对应的位置。这有可能需要根据实际情况来设置偏移量,另外,并发写文件需要加锁。

读文件为什么要并发??

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册