Skip to content

Commit 214ded9

Browse files
netdpbGoogle Java Core Libraries
authored andcommitted
Init LockFreeBitArray with length to reduce memory when deserializing BloomFilter.
Closes #5799. Fixes #5770. RELNOTES=n/a PiperOrigin-RevId: 414744518
1 parent 1566940 commit 214ded9

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

android/guava/src/com/google/common/hash/BloomFilter.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.google.common.base.Predicate;
2424
import com.google.common.hash.BloomFilterStrategies.LockFreeBitArray;
2525
import com.google.common.math.DoubleMath;
26+
import com.google.common.math.LongMath;
2627
import com.google.common.primitives.SignedBytes;
2728
import com.google.common.primitives.UnsignedBytes;
2829
import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -540,11 +541,13 @@ public void writeTo(OutputStream out) throws IOException {
540541
dataLength = din.readInt();
541542

542543
Strategy strategy = BloomFilterStrategies.values()[strategyOrdinal];
543-
long[] data = new long[dataLength];
544-
for (int i = 0; i < data.length; i++) {
545-
data[i] = din.readLong();
544+
545+
LockFreeBitArray dataArray = new LockFreeBitArray(LongMath.checkedMultiply(dataLength, 64L));
546+
for (int i = 0; i < dataArray.data.length(); i++) {
547+
dataArray.data.set(i, din.readLong());
546548
}
547-
return new BloomFilter<T>(new LockFreeBitArray(data), numHashFunctions, funnel, strategy);
549+
550+
return new BloomFilter<T>(dataArray, numHashFunctions, funnel, strategy);
548551
} catch (RuntimeException e) {
549552
String message =
550553
"Unable to deserialize BloomFilter from InputStream."

guava/src/com/google/common/hash/BloomFilter.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.google.common.base.Predicate;
2424
import com.google.common.hash.BloomFilterStrategies.LockFreeBitArray;
2525
import com.google.common.math.DoubleMath;
26+
import com.google.common.math.LongMath;
2627
import com.google.common.primitives.SignedBytes;
2728
import com.google.common.primitives.UnsignedBytes;
2829
import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -607,11 +608,13 @@ public void writeTo(OutputStream out) throws IOException {
607608
dataLength = din.readInt();
608609

609610
Strategy strategy = BloomFilterStrategies.values()[strategyOrdinal];
610-
long[] data = new long[dataLength];
611-
for (int i = 0; i < data.length; i++) {
612-
data[i] = din.readLong();
611+
612+
LockFreeBitArray dataArray = new LockFreeBitArray(LongMath.checkedMultiply(dataLength, 64L));
613+
for (int i = 0; i < dataArray.data.length(); i++) {
614+
dataArray.data.set(i, din.readLong());
613615
}
614-
return new BloomFilter<T>(new LockFreeBitArray(data), numHashFunctions, funnel, strategy);
616+
617+
return new BloomFilter<T>(dataArray, numHashFunctions, funnel, strategy);
615618
} catch (RuntimeException e) {
616619
String message =
617620
"Unable to deserialize BloomFilter from InputStream."

0 commit comments

Comments
 (0)