大白菜
发布于

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()

}
浏览 (513)
点赞 (1)
收藏
2条评论
大白菜
大白菜
已解决,弄错了先后顺序
点赞
评论
杞人忧天
挺好
点赞
评论
大白菜
大白菜
各位大佬帮忙支支招,看看问题出在哪里
点赞
评论