2017-01-04 11 views
3

При определении декодера, который должен быть предоставлен классам DatumReader, существует возможность повторного использования декодера, как вы можете видеть ниже. Как упоминалось в документе, класс декодера является неизменным и потокобезопасным, поэтому имеет смысл его повторно использовать. Какая была бы лучшая практика, нужно было бы повторно использовать декодер? Есть ли накладные расходы на производительность, если мы создаем декодер каждый раз, когда мы пытаемся декодировать полезную нагрузку Avro?Avro: повторное использование декодера

DatumReader<T> reader = new ReflectDatumReader<>(writerSchema, readerSchema); 
// Second argument is a decoder to be reused 
DecoderFactory.get().binaryDecoder(record, null); 
reader.read(null, binaryDecoder); 

ответ

1

Такая оптимизация не должна быть необходимой и, скорее всего, на самом деле не улучшит производительность. Сообщите нам, если вы заметите иначе.

В основном, кодер создается и сериализуется во время подачи трубопровода в качестве части описания задания. Он десериализуется на каждом сервере для создания экземпляров для данной единицы работы. Эти единицы работы достаточно велики, чтобы не создавать тонны кодеров, поэтому это не должно быть проблемой производительности.

Кроме того, AvroCoder сериализует схему, поэтому отражение не будет выполняться несколько раз. Кроме того, просто совместное использование экземпляра (например, описанное) фактически не приведет к совместному использованию десериализованных экземпляров.

+0

AvroCoder сохраняет декодер в threadlocal, чтобы избежать множественного создания BinaryDecoder, например. Независимо от того, что я не задаю вопрос в отношении AvroCoder, этот вопрос является общим вопросом для Avro. При выполнении вышеуказанного кода мы должны его повторно использовать или нет? Любопытно, если нет никакой пользы, почему вы повторно используете его в AvroCoder? – Mayumi

+1

Я думаю, что избежать воссоздания файлов в AvroCoder немного улучшает производительность в зависимости от размера декодируемых элементов и того, как часто они будут созданы. Но обратите внимание, что он использует 'ThreadLocal' отчасти потому, что декодер не всегда является потокобезопасным. –

 Смежные вопросы

  • Нет связанных вопросов^_^