美文网首页
Golang多线程读取千万级文件目录

Golang多线程读取千万级文件目录

作者: FredricZhu | 来源:发表于2019-06-13 07:51 被阅读0次
    package main
    
    import (
        "fmt"
        "io"
        "os"
    )
    
    func Exists(path string) bool {
        _, err := os.Stat(path)
        if err != nil {
            if os.IsExist(err) {
                return true
            }
            return false
        }
        return true
    }
    
    func appendToFile(f *os.File, content string) error {
        // 以只写的模式,打开文件
    
        // 查找文件末尾的偏移量
        n, _ := f.Seek(0, os.SEEK_END)
        // 从末尾的偏移量开始写入内容
        _, err := f.WriteAt([]byte(content), n)
    
        return err
    }
    
    func main() {
    
        fmt.Printf("Please input a file name to save content:")
        var fileName string
        fmt.Scanln(&fileName)
    
        if Exists(fileName) {
            os.Remove(fileName)
        }
    
        f, _ := os.Create(fileName)
        defer f.Close()
    
        saveContentFile, err := os.OpenFile(fileName, os.O_WRONLY, 0644)
        if err != nil {
            fmt.Println("Save Content file create failed. err: " + err.Error())
        }
    
        fmt.Printf("Please input the list file dir name:")
        var text string
        fmt.Scanln(&text)
        fmt.Println(text)
        listfileDir, err2 := os.Open(text)
        if err2 != nil {
            panic("Read dir error, [" + err2.Error() + "]")
        }
    
        readCurrent := func(ch *chan string) {
            defer close(*ch)
            infos, err := listfileDir.Readdir(1000)
            if err != io.EOF {
                for _, info := range infos {
                    *ch <- info.Name()
                }
            }
    
        }
    
        for i := 0; i < 10000; i++ {
            ch := make(chan string, 1000)
            go readCurrent(&ch)
    
            for j := 0; j < 1000; j++ {
                content, err := <-ch
                if err != false {
                    appendToFile(saveContentFile, content+"\n")
                }
            }
        }
    
        defer saveContentFile.Close()
    
    }
    

    使用如下语句在Linux系统上面运行,Windows也兼容。


    image.png

    运行完成之后,查看记录文件。


    image.png

    相关文章

      网友评论

          本文标题:Golang多线程读取千万级文件目录

          本文链接:https://www.haomeiwen.com/subject/otgdfctx.html