gpt4 book ai didi

go - 如何在 Go 中处理来自 Druid 查询的大型 http 响应体

转载 作者:行者123 更新时间:2023-12-01 22:26:29 26 4
gpt4 key购买 nike

我目前正在查询 Druid 并返回一个大型数据集(大约 4-5GB)。我想处理此响应并将 JSON 解码为结构列表。当我更改查询以返回较小的数据集时,它工作正常,但是一旦响应变得太大,我就会得到 unexpected EOF错误。

我已经尝试阅读整个响应正文

bytes, err := ioutil.ReadAll(resp.Body)

直接解码响应体
var object []NewObject
err = json.NewDecoder(resp.Body).Decode(&object)

创建缓冲区并写入文件
f, err := os.OpenFile("/tmp/test.txt", os.O_APPEND|os.O_WRONLY, 0600)
defer f.Close()
const oneMB = 1024 * 1024
bytesRead := 0
respBuf := make([]byte, oneMB)

// Read the response body
for {
n, err := resp.Body.Read(respBuf)
bytesRead += n

if err == io.EOF {
break
}

if err != nil {
fmt.Println("Error reading HTTP response: ", err.Error())
break
}

if _, err = f.Write(respBuf); err != nil {
panic(err)
}

}

所有这些都以我得到 unexpected EOF 结束。错误。我使用默认 net/http , 和 encoding/json看起来它们应该可以正常工作的模块。还有什么我可以尝试的吗?

最佳答案

我已经弄清楚了问题所在。似乎 Druid 有一个硬查询超时(此 link 解释了有关这些配置设置的更多信息)。有趣的是,如果您希望将响应作为对象并且它太大,它只会切断中间字节流,但如果您希望结果作为数组并且太大,它会发送字节以完成当前元素,然后发送结束 ]因此,当您解析结果时,它似乎全部通过(没有错误),尽管您可能已被中途切断。

关于go - 如何在 Go 中处理来自 Druid 查询的大型 http 响应体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59724527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com