Как я могу обработать большое тело http ответа от запроса Друида в Go

В настоящее время я запрашиваю Друида и возвращаю большой набор данных обратно (примерно 4-5 ГБ). Я хотел бы обработать этот ответ и декодировать JSON в список структур. У меня это работает нормально, когда я изменяю запрос, чтобы вернуть меньший набор данных, но как только ответ становится слишком большим, я получаю unexpected EOF ошибку 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 ошибку unexpected EOF . Я использую по умолчанию net/http и модуль encoding/json которые, по-видимому, должны работать нормально. Есть что-нибудь еще, что я могу попробовать?

Всего 1 ответ


Я понял проблему. Похоже, что у Друида есть жесткий тайм-аут запроса (эта ссылка объясняет больше об этих настройках конфигурации). Что интересно, он появляется, если вы хотите получить ответ как объект, и он слишком велик, он просто обрезает середину байтового потока, но если вы хотите получить результат в виде массива и он слишком велик, он отправит байты для завершения текущего элемент, а затем отправить закрытие ] поэтому, когда вы анализируете результат, кажется, что все прошло (без ошибок), хотя вы могли быть отрезаны в середине потока.


Есть идеи?

10000