From a33a55fcb59c9de341bc3169defda94df2910e65 Mon Sep 17 00:00:00 2001 From: Nishith Agarwal Date: Sun, 5 May 2019 21:26:16 -0700 Subject: [PATCH] Caching Avro Binary encoder/decoder to avoid creating new one for every record --- .../common/table/log/block/HoodieAvroDataBlock.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/hoodie-common/src/main/java/com/uber/hoodie/common/table/log/block/HoodieAvroDataBlock.java b/hoodie-common/src/main/java/com/uber/hoodie/common/table/log/block/HoodieAvroDataBlock.java index b8822521f..f926d3279 100644 --- a/hoodie-common/src/main/java/com/uber/hoodie/common/table/log/block/HoodieAvroDataBlock.java +++ b/hoodie-common/src/main/java/com/uber/hoodie/common/table/log/block/HoodieAvroDataBlock.java @@ -37,6 +37,8 @@ import org.apache.avro.Schema; import org.apache.avro.generic.GenericDatumReader; import org.apache.avro.generic.GenericDatumWriter; import org.apache.avro.generic.IndexedRecord; +import org.apache.avro.io.BinaryDecoder; +import org.apache.avro.io.BinaryEncoder; import org.apache.avro.io.Decoder; import org.apache.avro.io.DecoderFactory; import org.apache.avro.io.Encoder; @@ -52,6 +54,8 @@ public class HoodieAvroDataBlock extends HoodieLogBlock { private List records; private Schema schema; + private ThreadLocal encoderCache = new ThreadLocal<>(); + private ThreadLocal decoderCache = new ThreadLocal<>(); public HoodieAvroDataBlock(@Nonnull List records, @Nonnull Map header, @@ -118,7 +122,8 @@ public class HoodieAvroDataBlock extends HoodieLogBlock { while (itr.hasNext()) { IndexedRecord s = itr.next(); ByteArrayOutputStream temp = new ByteArrayOutputStream(); - Encoder encoder = EncoderFactory.get().binaryEncoder(temp, null); + BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(temp, encoderCache.get()); + encoderCache.set(encoder); try { // Encode the record into bytes writer.write(s, encoder); @@ -201,8 +206,9 @@ public class HoodieAvroDataBlock extends HoodieLogBlock { // 3. Read the content for (int i = 0; i < totalRecords; i++) { int recordLength = dis.readInt(); - Decoder decoder = DecoderFactory.get() - .binaryDecoder(getContent().get(), dis.getNumberOfBytesRead(), recordLength, null); + BinaryDecoder decoder = DecoderFactory.get() + .binaryDecoder(getContent().get(), dis.getNumberOfBytesRead(), recordLength, decoderCache.get()); + decoderCache.set(decoder); IndexedRecord record = reader.read(null, decoder); records.add(record); dis.skipBytes(recordLength);