Skip to content

Commit f8e1333

Browse files
committed
Add batch read methods to PlainValuesReader with bulk ByteBuffer view reads
Add readIntegers/readFloats/readLongs/readDoubles batch methods to all PlainValuesReader inner classes. All four types use bulk typed-buffer view reads (e.g. buffer.asIntBuffer().get(dest, offset, count)) which bypass per-value bounds checks and position updates. Benchmark results (PlainDecodingBenchmark, 100K values, pre-allocated arrays): Type Per-value (ops/s) Batch (ops/s) Speedup INT32 5,454M 28,256M +418% FLOAT 5,407M 25,798M +377% INT64 5,408M 8,088M +50% DOUBLE 7,404M 7,965M +8%
1 parent 80f9fea commit f8e1333

1 file changed

Lines changed: 36 additions & 0 deletions

File tree

parquet-column/src/main/java/org/apache/parquet/column/values/plain/PlainValuesReader.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ public void skip(int n) {
6767
public double readDouble() {
6868
return buffer.getDouble();
6969
}
70+
71+
/**
72+
* Reads {@code count} doubles into {@code dest} starting at {@code offset}.
73+
* Uses a bulk {@link java.nio.DoubleBuffer} view read for reduced per-value overhead.
74+
*/
75+
public void readDoubles(double[] dest, int offset, int count) {
76+
buffer.asDoubleBuffer().get(dest, offset, count);
77+
buffer.position(buffer.position() + count * Double.BYTES);
78+
}
7079
}
7180

7281
public static class FloatPlainValuesReader extends PlainValuesReader {
@@ -80,6 +89,15 @@ public void skip(int n) {
8089
public float readFloat() {
8190
return buffer.getFloat();
8291
}
92+
93+
/**
94+
* Reads {@code count} floats into {@code dest} starting at {@code offset}.
95+
* Uses a bulk {@link java.nio.FloatBuffer} view read for reduced per-value overhead.
96+
*/
97+
public void readFloats(float[] dest, int offset, int count) {
98+
buffer.asFloatBuffer().get(dest, offset, count);
99+
buffer.position(buffer.position() + count * Float.BYTES);
100+
}
83101
}
84102

85103
public static class IntegerPlainValuesReader extends PlainValuesReader {
@@ -93,6 +111,15 @@ public void skip(int n) {
93111
public int readInteger() {
94112
return buffer.getInt();
95113
}
114+
115+
/**
116+
* Reads {@code count} integers into {@code dest} starting at {@code offset}.
117+
* Uses a bulk {@link java.nio.IntBuffer} view read for reduced per-value overhead.
118+
*/
119+
public void readIntegers(int[] dest, int offset, int count) {
120+
buffer.asIntBuffer().get(dest, offset, count);
121+
buffer.position(buffer.position() + count * Integer.BYTES);
122+
}
96123
}
97124

98125
public static class LongPlainValuesReader extends PlainValuesReader {
@@ -106,5 +133,14 @@ public void skip(int n) {
106133
public long readLong() {
107134
return buffer.getLong();
108135
}
136+
137+
/**
138+
* Reads {@code count} longs into {@code dest} starting at {@code offset}.
139+
* Uses a bulk {@link java.nio.LongBuffer} view read for reduced per-value overhead.
140+
*/
141+
public void readLongs(long[] dest, int offset, int count) {
142+
buffer.asLongBuffer().get(dest, offset, count);
143+
buffer.position(buffer.position() + count * Long.BYTES);
144+
}
109145
}
110146
}

0 commit comments

Comments
 (0)