0
0
Fork 0

Merge pull request #770 from steveyen/optimize-prealloced-postings-iterator

scorch zap segment merging reuses prealloc'ed PostingsIterator
This commit is contained in:
Steve Yen 2018-02-13 10:02:42 -08:00 committed by GitHub
commit 29663c2795
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 6 deletions

View File

@ -44,7 +44,6 @@ func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap, rv *Posti
*rv = PostingsList{} // clear the struct *rv = PostingsList{} // clear the struct
} }
rv.sb = d.sb rv.sb = d.sb
rv.term = term
rv.except = except rv.except = except
if d.fst != nil { if d.fst != nil {

View File

@ -164,6 +164,7 @@ func persistMergedRest(segments []*SegmentBase, drops []*roaring.Bitmap,
var bufLoc []uint64 var bufLoc []uint64
var postings *PostingsList var postings *PostingsList
var postItr *PostingsIterator
rv := make([]uint64, len(fieldsInv)) rv := make([]uint64, len(fieldsInv))
fieldDvLocs := make([]uint64, len(fieldsInv)) fieldDvLocs := make([]uint64, len(fieldsInv))
@ -247,7 +248,7 @@ func persistMergedRest(segments []*SegmentBase, drops []*roaring.Bitmap,
return nil, 0, err2 return nil, 0, err2
} }
postItr := postings.Iterator() postItr = postings.iterator(postItr)
next, err2 := postItr.Next() next, err2 := postItr.Next()
for next != nil && err2 == nil { for next != nil && err2 == nil {
hitNewDocNum := newDocNums[dictI][next.Number()] hitNewDocNum := newDocNums[dictI][next.Number()]

View File

@ -28,21 +28,27 @@ import (
// PostingsList is an in-memory represenation of a postings list // PostingsList is an in-memory represenation of a postings list
type PostingsList struct { type PostingsList struct {
sb *SegmentBase sb *SegmentBase
term []byte
postingsOffset uint64 postingsOffset uint64
freqOffset uint64 freqOffset uint64
locOffset uint64 locOffset uint64
locBitmap *roaring.Bitmap locBitmap *roaring.Bitmap
postings *roaring.Bitmap postings *roaring.Bitmap
except *roaring.Bitmap except *roaring.Bitmap
postingKey []byte
} }
// Iterator returns an iterator for this postings list // Iterator returns an iterator for this postings list
func (p *PostingsList) Iterator() segment.PostingsIterator { func (p *PostingsList) Iterator() segment.PostingsIterator {
rv := &PostingsIterator{ return p.iterator(nil)
postings: p, }
func (p *PostingsList) iterator(rv *PostingsIterator) *PostingsIterator {
if rv == nil {
rv = &PostingsIterator{}
} else {
*rv = PostingsIterator{} // clear the struct
} }
rv.postings = p
if p.postings != nil { if p.postings != nil {
// prepare the freq chunk details // prepare the freq chunk details
var n uint64 var n uint64