我是一名新毕业的SWE学习Go(并喜欢它)。
我正在为Wikipedia转储文件构建解析器 - 基本上是一个巨大的bzip2压缩XML文件(约50GB未压缩)。
我想要进行流式解压缩和解析,听起来很简单。对于减压,我这样做:
inputFilePath := flag.Arg(0)
inputReader := bzip2.NewReader(inputFile)
然后将读者传递给XML解析器:
decoder := xml.NewDecoder(inputFile)
但是,由于解压缩和解析都是昂贵的操作,我希望让它们在单独的Go例程上运行以使用其他内核。我将如何在Go中进行此操作?
我唯一能想到的是将文件包装在chan []字节中,并实现io.Reader接口,但我认为可能有一种构建方式(并且更清晰)的方式。
有没有人做过这样的事情?
谢谢! 曼努埃尔
答案 0 :(得分:2)
答案 1 :(得分:0)
一个简单的解决方案是使用我之前创建的预读包:https://github.com/klauspost/readahead
inputReader := bzip2.NewReader(inputFile)
ra := readahead.NewReader(input)
defer ra.Close()
然后将阅读器传递给XML解析器:
decoder := xml.NewDecoder(ra)
使用默认设置,它将在4个缓冲区中提前解码多达4MB。