0
0
Fork 0

scorch optimizations for mem.PostingsIterator.Next() & docTermMap

Due to the usage rules of iterators, mem.PostingsIterator.Next() can
reuse its returned Postings instance.

Also, there's a micro optimization in persistDocValues() for one fewer
access to the docTermMap in the inner-loop.
This commit is contained in:
Steve Yen 2018-03-03 10:59:53 -08:00
parent 4ebf3f1d44
commit 88c740095b
2 changed files with 5 additions and 6 deletions

View File

@ -73,6 +73,7 @@ type PostingsIterator struct {
offset int
locoffset int
actual roaring.IntIterable
reuse Posting
}
// Next returns the next posting on the postings list, or nil at the end
@ -92,17 +93,16 @@ func (i *PostingsIterator) Next() (segment.Posting, error) {
i.offset++
allN = i.all.Next()
}
rv := &Posting{
i.reuse = Posting{
iterator: i,
docNum: uint64(n),
offset: i.offset,
locoffset: i.locoffset,
hasLoc: i.locations.Contains(n),
}
i.locoffset += int(i.postings.dictionary.segment.Freqs[i.postings.postingsID-1][i.offset])
i.offset++
return rv, nil
return &i.reuse, nil
}
// Posting is a single entry in a postings list

View File

@ -552,8 +552,7 @@ func persistDocValues(memSegment *mem.Segment, w *CountHashWriter,
nextPosting, err2 := postingsItr.Next()
for err2 == nil && nextPosting != nil {
docNum := nextPosting.Number()
docTermMap[docNum] = append(docTermMap[docNum], []byte(next.Term)...)
docTermMap[docNum] = append(docTermMap[docNum], termSeparator)
docTermMap[docNum] = append(append(docTermMap[docNum], []byte(next.Term)...), termSeparator)
nextPosting, err2 = postingsItr.Next()
}
if err2 != nil {
@ -562,10 +561,10 @@ func persistDocValues(memSegment *mem.Segment, w *CountHashWriter,
next, err = dictItr.Next()
}
if err != nil {
return nil, err
}
// sort wrt to docIDs
var docNumbers docIDRange
for k := range docTermMap {