ckx0709 2019-03-20 22:07
浏览 1695

go 读取本地大文本数据,跑多协程同时写入数据库,随机发生重复写入的情况。

func init() {
//建立数据可链接
db, e = sqlx.Connect("mysql", "root:123456@tcp(127.0.0.1:3306)/gowk")
HandleError(e, "sqlx.Connect")
defer db.Close()

//必要时建表
_, e = db.Exec("create table if not exists t_bigData_kf(id int primary key auto_increment,name varchar(30),idcard char(18));")
HandleError(e, "db.Exec create table")
fmt.Println("数据表已创建")

//初始存取数据管道
chkp = make(chan *kfperson, 10000000)
chbd = make(chan *kfperson, 100)
//开启1000条协程写入数据,
for i := 0; i < 100; i++ {
    go insertKftable()
}
//准备一个处理脏数据的协程
go writeBadTxt()

//创建一个失败数据Txt
A_bad, _ = os.OpenFile("E:/假数据/清洗数据/A_bad.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0754)
defer A_bad.Close()

//读取大数据文本
file, e := os.Open("E:/假数据/清洗数据/A.txt")
HandleError(e, "os.Open")
defer file.Close()
//以缓存的方式读出,区别于ioutil.ReadFile()一次性读入文件到内存,不适合大文本的读取
reader := bufio.NewReader(file)
//kfps := new(kfperson)
for {
    linStr, e := reader.ReadString('\n')
    if e == io.EOF {
        close(chbd)
        close(chkp)
        break
    }
    HandleError(e, "reader.ReadString")
    linSplic := strings.Split(linStr, ",")
    //kfps.Name, kfps.Idcard = linSplic[0], linSplic[1]

    name,idcard:=linSplic[0], linSplic[1]
    kfps := kfperson{Name: name, Idcard: idcard}

    chkp <- &kfps
}

}

func writeBadTxt() {
writer := bufio.NewWriter(A_bad)
for ps := range chbd {
writer.WriteString(ps.Name + "," + ps.Idcard + "\n")
fmt.Println("***************************************", "Gid:", GetGID())
}
writer.Flush()
}

func insertKftable() {

for ps := range chkp {
    _, e := db.Exec("insert into t_bigData_kf(name,idcard) values(?,?);", ps.Name, ps.Idcard)
    if e == nil {
        fmt.Println("chkp:", len(chkp), "\t", "Gid:", GetGID())
    } else {
        chbd <- ps
    }
}

}


```这些代码我看了一个晚上,我找不出问题在哪里?请求高手指点迷津!
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 求差集那个函数有问题,有无佬可以解决
    • ¥15 【提问】基于Invest的水源涵养
    • ¥20 微信网友居然可以通过vx号找到我绑的手机号
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名
    • ¥65 汇编语言除法溢出问题