diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-11-18 11:31:36 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-11-18 11:31:36 +0100 |
commit | 6cd79e8cfeb51da3120af2dcf56e04cfce52f778 (patch) | |
tree | a0cab95cb60662ef1748e482c806c05eb443fab3 /vespajlib | |
parent | 4b23091addb64b92a40369d1bf71f541ca3c704a (diff) |
Store rank properties in compressed form
We run out of memory on mutlitenant config servers due to spending
too mcuh memory storing large rank profiles. This removes
most of that cost by storing the rank profile as compressed bytes.
Diffstat (limited to 'vespajlib')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/compress/Compressor.java | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java index 664ceaea7dc..681f95142ab 100644 --- a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java +++ b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java @@ -75,15 +75,15 @@ public class Compressor { switch (requestedCompression) { case NONE: data = uncompressedSize.isPresent() ? Arrays.copyOf(data, uncompressedSize.get()) : data; - return new Compression(CompressionType.NONE, data); + return new Compression(CompressionType.NONE, data.length, data); case LZ4: int dataSize = uncompressedSize.isPresent() ? uncompressedSize.get() : data.length; - if (dataSize < compressMinSizeBytes) return new Compression(CompressionType.INCOMPRESSIBLE, data); + if (dataSize < compressMinSizeBytes) return new Compression(CompressionType.INCOMPRESSIBLE, dataSize, data); LZ4Compressor compressor = level < 7 ? factory.fastCompressor() : factory.highCompressor(); byte[] compressedData = compressor.compress(data); if (compressedData.length + 8 >= dataSize * compressionThresholdFactor) - return new Compression(CompressionType.INCOMPRESSIBLE, data); - return new Compression(CompressionType.LZ4, compressedData); + return new Compression(CompressionType.INCOMPRESSIBLE, dataSize, data); + return new Compression(CompressionType.LZ4, dataSize, compressedData); default: throw new IllegalArgumentException(requestedCompression + " is not supported"); } @@ -124,19 +124,24 @@ public class Compressor { throw new IllegalArgumentException(compression + " is not supported"); } } - /** Decompress some data */ - public byte[] decompress(byte[] compressedData, CompressionType compression, int uncompressedSize) { - return decompress(compression, compressedData, 0, uncompressedSize, Optional.empty()); + /** Decompresses some data */ + public byte[] decompress(byte[] compressedData, CompressionType compressionType, int uncompressedSize) { + return decompress(compressionType, compressedData, 0, uncompressedSize, Optional.empty()); + } + /** Decompresses some data */ + public byte[] decompress(Compression compression) { + return decompress(compression.type(), compression.data(), 0, compression.uncompressedSize(), Optional.empty()); } public static class Compression { private final CompressionType compressionType; - + private final int uncompressedSize; private final byte[] data; - public Compression(CompressionType compressionType, byte[] data) { + public Compression(CompressionType compressionType, int uncompressedSize, byte[] data) { this.compressionType = compressionType; + this.uncompressedSize = uncompressedSize; this.data = data; } @@ -145,6 +150,9 @@ public class Compressor { * This will be either the requested compression or INCOMPRESSIBLE. */ public CompressionType type() { return compressionType; } + + /** Returns the uncompressed size of this data in bytes */ + public int uncompressedSize() { return uncompressedSize; } /** Returns the uncompressed data in a buffer which gets owned by the caller */ public byte[] data() { return data; } |