diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-10-12 00:56:08 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2022-10-12 00:56:08 +0200 |
commit | d81ca5ed1e254bc0dc4fe33a00d7ac641d9715aa (patch) | |
tree | aa2e717c05907178e61fbf56d9a2dc29104548c8 | |
parent | 4cf6952345ac2fdcb9b14f1dc875a17d4fa2796d (diff) |
- Presize array to its max size.
- Return the GrowableByteBuffer from TypedBinaryFormat instead of a copy of the buffer.
Then buffer is copied only once instead of twice.
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/dispatch/rpc/MapConverter.java | 7 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java | 6 |
2 files changed, 9 insertions, 4 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/MapConverter.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/MapConverter.java index 5e423a51b7a..3a9568a7370 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/MapConverter.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/MapConverter.java @@ -4,6 +4,7 @@ package com.yahoo.search.dispatch.rpc; import ai.vespa.searchlib.searchprotocol.protobuf.SearchProtocol.StringProperty; import ai.vespa.searchlib.searchprotocol.protobuf.SearchProtocol.TensorProperty; import com.google.protobuf.ByteString; +import com.yahoo.io.GrowableByteBuffer; import com.yahoo.tensor.Tensor; import com.yahoo.tensor.serialization.TypedBinaryFormat; @@ -51,12 +52,12 @@ public class MapConverter { for (var entry : map.entrySet()) { if (entry.getValue() != null) { var key = entry.getKey(); - var stringValues = new ArrayList<String>(); + var stringValues = new ArrayList<String>(entry.getValue().size()); for (var value : entry.getValue()) { if (value != null) { if (value instanceof Tensor tensor) { - byte[] encoded = TypedBinaryFormat.encode(tensor); - tensorInserter.accept(TensorProperty.newBuilder().setName(key).setValue(ByteString.copyFrom(encoded))); + var buffer = TypedBinaryFormat.encode(tensor, new GrowableByteBuffer(4096)); + tensorInserter.accept(TensorProperty.newBuilder().setName(key).setValue(ByteString.copyFrom(buffer.getByteBuffer().flip()))); } else { stringValues.add(value.toString()); } diff --git a/vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java b/vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java index a08e09765c8..951c23310dc 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/serialization/TypedBinaryFormat.java @@ -33,9 +33,13 @@ public class TypedBinaryFormat { public static byte[] encode(Tensor tensor) { GrowableByteBuffer buffer = new GrowableByteBuffer(); + encode(tensor, buffer); + return asByteArray(buffer); + } + public static GrowableByteBuffer encode(Tensor tensor, GrowableByteBuffer buffer) { BinaryFormat encoder = getFormatEncoder(buffer, tensor); encoder.encode(buffer, tensor); - return asByteArray(buffer); + return buffer; } /** |