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 offset int
locoffset int locoffset int
actual roaring.IntIterable actual roaring.IntIterable
reuse Posting
} }
// Next returns the next posting on the postings list, or nil at the end // 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++ i.offset++
allN = i.all.Next() allN = i.all.Next()
} }
rv := &Posting{ i.reuse = Posting{
iterator: i, iterator: i,
docNum: uint64(n), docNum: uint64(n),
offset: i.offset, offset: i.offset,
locoffset: i.locoffset, locoffset: i.locoffset,
hasLoc: i.locations.Contains(n), hasLoc: i.locations.Contains(n),
} }
i.locoffset += int(i.postings.dictionary.segment.Freqs[i.postings.postingsID-1][i.offset]) i.locoffset += int(i.postings.dictionary.segment.Freqs[i.postings.postingsID-1][i.offset])
i.offset++ i.offset++
return rv, nil return &i.reuse, nil
} }
// Posting is a single entry in a postings list // 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() nextPosting, err2 := postingsItr.Next()
for err2 == nil && nextPosting != nil { for err2 == nil && nextPosting != nil {
docNum := nextPosting.Number() docNum := nextPosting.Number()
docTermMap[docNum] = append(docTermMap[docNum], []byte(next.Term)...) docTermMap[docNum] = append(append(docTermMap[docNum], []byte(next.Term)...), termSeparator)
docTermMap[docNum] = append(docTermMap[docNum], termSeparator)
nextPosting, err2 = postingsItr.Next() nextPosting, err2 = postingsItr.Next()
} }
if err2 != nil { if err2 != nil {
@ -562,10 +561,10 @@ func persistDocValues(memSegment *mem.Segment, w *CountHashWriter,
next, err = dictItr.Next() next, err = dictItr.Next()
} }
if err != nil { if err != nil {
return nil, err return nil, err
} }
// sort wrt to docIDs // sort wrt to docIDs
var docNumbers docIDRange var docNumbers docIDRange
for k := range docTermMap { for k := range docTermMap {