From 8c2520d55cb1fca6c01659386785720dfd061577 Mon Sep 17 00:00:00 2001 From: Steve Yen Date: Wed, 7 Feb 2018 14:29:51 -0800 Subject: [PATCH] scorch zap optimize via postingsList reuse pprof graphs were showing many postingsList allocations during merging, so this change optimizes by reusing postingList memory in the merging loops. --- index/scorch/segment/zap/dict.go | 15 +++++++++------ index/scorch/segment/zap/merge.go | 5 ++++- index/scorch/segment/zap/merge_test.go | 4 ++-- index/scorch/segment/zap/segment.go | 3 ++- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/index/scorch/segment/zap/dict.go b/index/scorch/segment/zap/dict.go index 0f5145fb..137c35d7 100644 --- a/index/scorch/segment/zap/dict.go +++ b/index/scorch/segment/zap/dict.go @@ -34,15 +34,18 @@ type Dictionary struct { // PostingsList returns the postings list for the specified term func (d *Dictionary) PostingsList(term string, except *roaring.Bitmap) (segment.PostingsList, error) { - return d.postingsList([]byte(term), except) + return d.postingsList([]byte(term), except, nil) } -func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap) (*PostingsList, error) { - rv := &PostingsList{ - sb: d.sb, - term: term, - except: except, +func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { + if rv == nil { + rv = &PostingsList{} + } else { + *rv = PostingsList{} // clear the struct } + rv.sb = d.sb + rv.term = term + rv.except = except if d.fst != nil { postingsOffset, exists, err := d.fst.Get(term) diff --git a/index/scorch/segment/zap/merge.go b/index/scorch/segment/zap/merge.go index 319d8134..1e75439a 100644 --- a/index/scorch/segment/zap/merge.go +++ b/index/scorch/segment/zap/merge.go @@ -155,6 +155,8 @@ func persistMergedRest(segments []*Segment, drops []*roaring.Bitmap, var bufMaxVarintLen64 []byte = make([]byte, binary.MaxVarintLen64) var bufLoc []uint64 + var postings *PostingsList + rv := make([]uint64, len(fieldsInv)) fieldDvLocs := make([]uint64, len(fieldsInv)) fieldDvLocsOffset := uint64(fieldNotUninverted) @@ -231,7 +233,8 @@ func persistMergedRest(segments []*Segment, drops []*roaring.Bitmap, if dict == nil { continue } - postings, err2 := dict.postingsList(term, drops[dictI]) + var err2 error + postings, err2 = dict.postingsList(term, drops[dictI], postings) if err2 != nil { return nil, 0, err2 } diff --git a/index/scorch/segment/zap/merge_test.go b/index/scorch/segment/zap/merge_test.go index 4453cfcd..323fffed 100644 --- a/index/scorch/segment/zap/merge_test.go +++ b/index/scorch/segment/zap/merge_test.go @@ -310,8 +310,8 @@ func compareSegments(a, b *Segment) string { continue } - aplist, aerr := adict.(*Dictionary).postingsList([]byte(next.Term), nil) - bplist, berr := bdict.(*Dictionary).postingsList([]byte(next.Term), nil) + aplist, aerr := adict.(*Dictionary).postingsList([]byte(next.Term), nil, nil) + bplist, berr := bdict.(*Dictionary).postingsList([]byte(next.Term), nil, nil) if aerr != berr { rv = append(rv, fmt.Sprintf("field %s, term: %s, postingsList() errors different: %v %v", fieldName, next.Term, aerr, berr)) diff --git a/index/scorch/segment/zap/segment.go b/index/scorch/segment/zap/segment.go index 94268cac..40c0af27 100644 --- a/index/scorch/segment/zap/segment.go +++ b/index/scorch/segment/zap/segment.go @@ -343,8 +343,9 @@ func (s *SegmentBase) DocNumbers(ids []string) (*roaring.Bitmap, error) { return nil, err } + var postings *PostingsList for _, id := range ids { - postings, err := idDict.postingsList([]byte(id), nil) + postings, err = idDict.postingsList([]byte(id), nil, postings) if err != nil { return nil, err }