当缓冲区接收数据时,将exec.Command输出复制到文件

时间:2017-04-06 00:12:59

标签: go io buffer

我有一个脚本,可以在运行时将相当多的文本转储到STDOUT中。我正在尝试执行此脚本并将输出写入文件,而不是一次将整个缓冲区保存在内存中。 (我们正在谈论这个脚本一次输出的许多兆字节文本。)

以下是有效的,但是因为我在几个goroutines中这样做,我的记忆消耗量达到了> 5GB,我真的想避免:

var out bytes.Buffer
cmd := exec.Command("/path/to/script/binary", "arg1", "arg2")
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
    log.Fatal(err)
}
out.WriteTo(io) // io is the writer connected to the new file

理想情况下,当out填满时,我想将其清空到我的目标文件中以保持较低的内存使用率。我已经尝试将其更改为:

cmd := exec.Command("/path/to/script/binary", "arg1", "arg2")
cmd.Start()
stdout, _ := cmd.StdoutPipe()
r := *bufio.NewReader(stdout)
r.WriteTo(io)
cmd.Wait()

但是,当我打印出这些变量stdout<nil>时,r{[0 0 0 0 0...]}r.WriteTo恐慌:invalid memory address or nil pointer dereference

是否可以编写cmd的输出,因为它是为了减少内存使用量而生成的?谢谢!

1 个答案:

答案 0 :(得分:2)

为什么不直接写文件?

file, _ := os.Create("/some/file")
cmd.Stdout = file

或者使用你的io事物(对于变量而言,这是一个可怕的名称,顺便说一下,因为它是一个标准库包的名称),b)含糊不清 - 什么做这意味着什么?)

cmd.Stdout = io