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

FredricZhu · · 139 次点击 · · 开始浏览    
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

本文来自:简书

感谢作者:FredricZhu

查看原文:Golang多线程读取千万级文件目录

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

139 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传