Как клиент Джерси мог обработать огромную полезную нагрузку, не вызывая проблему с памятью? - PullRequest
0 голосов
/ 14 ноября 2018

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

1 Ответ

0 голосов
/ 15 ноября 2018

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

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

JsonFactory factory = ObjectMapper.getJsonFactory();

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

    while(parser.nextToken() != JsonToken.END_OBJECT) {
        // process tokens, etc. here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...