GoLang:在goroutine中解压缩bz2,在其他goroutine中消耗

时间:2016-03-25 21:53:36

标签: xml go concurrency goroutine bzip2

我是一名新毕业的SWE学习Go(并喜欢它)。

我正在为Wikipedia转储文件构建解析器 - 基本上是一个巨大的bzip2压缩XML文件(约50GB未压缩)。

我想要进行流式解压缩和解析,听起来很简单。对于减压,我这样做:

inputFilePath := flag.Arg(0) inputReader := bzip2.NewReader(inputFile)

然后将读者传递给XML解析器:

decoder := xml.NewDecoder(inputFile)

但是,由于解压缩和解析都是昂贵的操作,我希望让它们在单独的Go例程上运行以使用其他内核。我将如何在Go中进行此操作?

我唯一能想到的是将文件包装在chan []字节中,并实现io.Reader接口,但我认为可能有一种构建方式(并且更清晰)的方式。

有没有人做过这样的事情?

谢谢! 曼努埃尔

2 个答案:

答案 0 :(得分:2)

您可以使用io.Pipe,然后使用io.Copy将解压缩的数据推送到管道中,并在另一个goroutine中读取它:

SELECT

http://play.golang.org/p/fXLnfnaWYA

答案 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。