2
我有一個程序,結合了多個http響應,並寫入文件上的各個查找位置。我目前通過在Go中,如何有效地將流式http響應主體寫入文件中的查找位置?
client := new(http.Client)
req, _ := http.NewRequest("GET", os.Args[1], nil)
resp, _ := client.Do(req)
defer resp.Close()
reader, _ := ioutil.ReadAll(resp.Body) //Reads the entire response to memory
//Some func that gets the seek value someval
fs.Seek(int64(someval), 0)
fs.Write(reader)
這有時會導致因爲ioutil.ReadAll
的大內存使用情況做這個。
我試圖bytes.Buffer
作爲
buf := new(bytes.Buffer)
offset, _ := buf.ReadFrom(resp.Body) //Still reads the entire response to memory.
fs.Write(buf.Bytes())
,但它仍然是相同的。
我的意圖是使用緩衝寫入文件,然後再次尋找偏移量,並繼續寫入直到流的結束被接收(並因此從buf.ReadFrom中捕獲偏移值)。但它也將所有內容都保存在記憶中並立即寫入。
直接向磁盤寫入類似流的最佳方式是什麼,而不將整個內容保存在緩衝區中?
一個理解的例子將不勝感激。
謝謝。
如果你能讀響應體之前得到'someval':剛看了'someval'字節數從身體,而忽略他們,然後讀其餘的,或直接複製到文件。 – Volker
謝謝@Volker,我試圖在第二種情況下使用bytes.Buffer讀取'someval'多個字節,這顯然沒有發生,因爲我不知道如何正確執行它。如果你的意思是使用http'range'頭來讀取幾個字節,然後一次又一次地執行,那麼我正在訪問的http端點有一個連接限制,這限制了我在我的結尾處產生了太多的連接,依次將是耗時的。 – scott