LUCENE-2770: Optimize memory allocation on norms merging

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1037077 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Uwe Schindler 2010-11-19 23:18:59 +00:00
parent 4194ef01c4
commit 3430ee0ea5

View File

@ -35,7 +35,6 @@ import org.apache.lucene.store.Directory;
import org.apache.lucene.store.IndexInput;
import org.apache.lucene.store.IndexOutput;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.ReaderUtil;
import org.apache.lucene.util.MultiBits;
@ -641,7 +640,13 @@ final class SegmentMerger {
}
private void mergeNorms() throws IOException {
final BytesRef normBuffer = new BytesRef();
// get needed buffer size by finding the largest segment
int bufferSize = 0;
for (IndexReader reader : readers) {
bufferSize = Math.max(bufferSize, reader.maxDoc());
}
byte[] normBuffer = null;
IndexOutput output = null;
try {
for (int i = 0, numFieldInfos = fieldInfos.size(); i < numFieldInfos; i++) {
@ -651,21 +656,22 @@ final class SegmentMerger {
output = directory.createOutput(IndexFileNames.segmentFileName(segment, "", IndexFileNames.NORMS_EXTENSION));
output.writeBytes(NORMS_HEADER,NORMS_HEADER.length);
}
if (normBuffer == null) {
normBuffer = new byte[bufferSize];
}
for (IndexReader reader : readers) {
final int maxDoc = reader.maxDoc();
normBuffer.grow(maxDoc);
final byte[] norms = normBuffer.bytes;
reader.norms(fi.name, norms, 0);
reader.norms(fi.name, normBuffer, 0);
if (!reader.hasDeletions()) {
//optimized case for segments without deleted docs
output.writeBytes(norms, maxDoc);
output.writeBytes(normBuffer, maxDoc);
} else {
// this segment has deleted docs, so we have to
// check for every doc if it is deleted or not
final Bits delDocs = reader.getDeletedDocs();
for (int k = 0; k < maxDoc; k++) {
if (!delDocs.get(k)) {
output.writeByte(norms[k]);
output.writeByte(normBuffer[k]);
}
}
}