Мне нужно написать клиент Джерси, который должен обрабатывать огромную полезную нагрузку (> 1 ГБ), но проблема в том, что если я использую объектную модель Java, я получаю ошибку памяти. Я рассматриваю возможность использования потокового API Джексона, но меня смущает, что он по-прежнему буферизуется в памяти и занимает более 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
}
}
Это именно то, что я искал. Спасибо, Лысый.