gzip解压数据流入PG库发生数据多读或者少读的情况
代码具体流程如下:
1、使用ssh模块执行copy to stdout从源数据库读取数据
2、使用ssh模块的StdoutPipe返回io.Reader
3、使用gzip.NewReader解压流
4、使用io.CopyN复制数据值os.Stdout供外部表读取
结果就是500w的数据,总是会出现少读导致加载少列的情况。数据验证确实没有任何问题的。有什么好的办法处理这种问题?
func transfer(){
// 设置会话标准输出
reader, writer := io.Pipe()
session.Stdout = writer
// session.Stdout = os.Stdout
// reader, err := session.StdoutPipe()
// if err != nil {
// panic(fmt.Sprintf("Failed to open session StdoutPipe : %v", err))
// }
//运行reader线程
go ungzip(reader)
//执行COPY命令
if err := session.Run(cmd); err != nil {
panic(fmt.Sprintf("Failed to transfer data: %v", err))
}
writer.Close()
}
/*
解压数据并返回值标准输出(STDOUT)
*/
func ungzip(buff io.Reader) {
gzipReader, err := gzip.NewReader(buff)
if err != nil {
panic(fmt.Sprintf("无法创建gzip读取器,%v", err))
}
//将reader中的数据写入标准输出中
for {
if _, err := io.CopyN(os.Stdout, gzipReader, 1024*1024); err == io.EOF {
// panic(fmt.Sprintf("同步解压后的数据至标准输出异常,%v", err))
break
} else {
if err != nil {
panic(fmt.Sprintf("同步解压后的数据至标准输出异常,%v", err))
}
}
}
defer gzipReader.Close()
}
浏览 (778)
点赞 (1)
收藏