Reduce memory consumption of Tags by 50%

by storing only the bytes instead of the string.
This commit is contained in:
2018-03-28 19:08:53 +02:00
parent 81711d551f
commit 9f37243ba3

View File

@@ -1,5 +1,6 @@
package org.lucares.pdb.api; package org.lucares.pdb.api;
import java.nio.charset.StandardCharsets;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@@ -14,6 +15,7 @@ import java.util.regex.Pattern;
public class Tags { public class Tags {
public static StringCompressor STRING_COMPRESSOR = null; public static StringCompressor STRING_COMPRESSOR = null;
public static final byte[] EMPTY_BYTES = new byte[0];
public static final Tags EMPTY = new Tags(); public static final Tags EMPTY = new Tags();
public static final String KEY_VALUE_SEPARATOR = "-"; public static final String KEY_VALUE_SEPARATOR = "-";
@@ -29,10 +31,10 @@ public class Tags {
private static final Pattern EXTRACT_TAGS_PATTERN = Pattern.compile(REGEX_STORAGE_FILE); private static final Pattern EXTRACT_TAGS_PATTERN = Pattern.compile(REGEX_STORAGE_FILE);
private final String filename; private final byte[] filenameBytes;
public Tags() { public Tags() {
filename = ""; filenameBytes = EMPTY_BYTES;
} }
public Tags(final String filename) { public Tags(final String filename) {
@@ -42,11 +44,13 @@ public class Tags {
// after the $ is incremented // after the $ is incremented
// We only take the part until the $. // We only take the part until the $.
final int end = filename.indexOf(KEY_VALUE_END_SEPARATOR); final int end = filename.indexOf(KEY_VALUE_END_SEPARATOR);
final String normalizedFilename;
if (end >= 0) { if (end >= 0) {
this.filename = filename.substring(0, end); normalizedFilename = filename.substring(0, end);
} else { } else {
this.filename = filename; normalizedFilename = filename;
} }
this.filenameBytes = normalizedFilename.getBytes(StandardCharsets.UTF_8);
} }
public static Tags create(final Collection<Tag> tags) { public static Tags create(final Collection<Tag> tags) {
@@ -77,7 +81,7 @@ public class Tags {
} }
public String getFilename() { public String getFilename() {
return filename; return new String(this.filenameBytes, StandardCharsets.UTF_8);
} }
public String getValue(final String key) { public String getValue(final String key) {
@@ -93,6 +97,7 @@ public class Tags {
private SortedSet<Tag> toTags() { private SortedSet<Tag> toTags() {
final SortedSet<Tag> result = new TreeSet<>(TagByKeyComparator.INSTANCE); final SortedSet<Tag> result = new TreeSet<>(TagByKeyComparator.INSTANCE);
final String filename = new String(this.filenameBytes, StandardCharsets.UTF_8);
final Matcher matcher = EXTRACT_TAGS_PATTERN.matcher(filename); final Matcher matcher = EXTRACT_TAGS_PATTERN.matcher(filename);
if (matcher.find()) { if (matcher.find()) {
@@ -160,14 +165,14 @@ public class Tags {
@Override @Override
public String toString() { public String toString() {
return "Tags [filename=" + filename + "]"; return "Tags [filename=" + getFilename() + ", tags=" + toTags() + "]";
} }
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + ((filename == null) ? 0 : filename.hashCode()); result = prime * result + Arrays.hashCode(filenameBytes);
return result; return result;
} }
@@ -180,10 +185,7 @@ public class Tags {
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())
return false; return false;
final Tags other = (Tags) obj; final Tags other = (Tags) obj;
if (filename == null) { if (!Arrays.equals(filenameBytes, other.filenameBytes))
if (other.filename != null)
return false;
} else if (!filename.equals(other.filename))
return false; return false;
return true; return true;
} }
@@ -204,7 +206,7 @@ public class Tags {
} }
public boolean isEmpty() { public boolean isEmpty() {
return filename == null || filename.length() == 0; return filenameBytes == null || filenameBytes.length == 0;
} }
public static Tags create(final String filename) { public static Tags create(final String filename) {