Как клиент из Джерси мог справиться с огромной полезной нагрузкой, не вызывая проблем с памятью?

Мне нужно написать клиент Джерси, который должен обрабатывать огромную полезную нагрузку (> 1 ГБ), но проблема в том, что если я использую объектную модель Java, я получаю ошибку памяти. Я рассматриваю возможность использования потокового API Джексона, но меня смущает, что он по-прежнему буферизуется в памяти и занимает более 1 ГБ места. Может кто-нибудь объяснить, как работает потоковая передача на стороне клиента?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

API-интерфейс Jackson Streaming идентичен как на стороне сервера, так и на стороне клиента. Это может быть очень эффективно, но это значительно больше работы, чем API Databind, поскольку вам придется кодировать кучу этой работы самостоятельно. (см. Джексон Перформанс)

Функционально вы хотите оставить ввод в потоке и анализировать (и обрабатывать) его по частям. В случаях, когда вы знаете структуру или это массив, вы можете теоретически обрабатывать каждый объект в массиве по одному, чтобы избежать необходимости читать весь массив перед обработкой.

JsonFactory factory = ObjectMapper.getJsonFactory();

try(JsonParser parser = factory.createJsonParser(inputStream)) {

    while(parser.nextToken() != JsonToken.END_OBJECT) {
        // process tokens, etc. here
    }
}

Это именно то, что я искал. Спасибо, Лысый.

Tom 19.11.2018 21:40

Другие вопросы по теме