2017-04-06 34 views
1

我有一個腳本,在運行時將相當多的文本轉儲到STDOUT。我試圖執行這個腳本並將輸出寫入一個文件,而不是一次將整個緩衝區保存在內存中。 (我們正在談論這個腳本一次輸出的許多MB文本。)複製exec.Command輸出到文件,因爲緩衝區接收數據

以下工作,但因爲我在幾個例程中執行此操作,所以我的內存消耗高達> 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時輸出內容以減少內存使用量?謝謝!

回答

2

爲什麼不直接寫入文件?

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

或使用io的事情(這是一個變量一個可怕的名字,順便說一句,因爲它是一個)的標準庫包的名稱,B)曖昧 - 這是什麼意思)

cmd.Stdout = io 
+0

哇!我沒有意識到這是可能的(目標文件不在我的機器上)。完全同意,只是稱其爲'io'來從我的例子中刪除不相關的專有內容,但即使如此,也許應該避免這種情況以消除混淆。謝謝! – Ryan