diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2015-03-19 19:59:38 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2015-03-19 19:59:38 +0900 |
commit | d94dfe087694d68073f01a51c7357fc4741641d8 (patch) | |
tree | 6b607257229b76db9fc275c6fd3533e8c9190b34 /src/merger.go | |
parent | 6130026786fce0a8ac9e053694761405f4f599c3 (diff) |
Fix #151 - reduce initial memory footprint
Diffstat (limited to 'src/merger.go')
-rw-r--r-- | src/merger.go | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/merger.go b/src/merger.go index 41323c18..21a74597 100644 --- a/src/merger.go +++ b/src/merger.go @@ -10,6 +10,7 @@ var EmptyMerger = NewMerger([][]*Item{}, false, false) type Merger struct { lists [][]*Item merged []*Item + chunks *[]*Chunk cursors []int sorted bool tac bool @@ -17,11 +18,24 @@ type Merger struct { count int } +func PassMerger(chunks *[]*Chunk, tac bool) *Merger { + mg := Merger{ + chunks: chunks, + tac: tac, + count: 0} + + for _, chunk := range *mg.chunks { + mg.count += len(*chunk) + } + return &mg +} + // NewMerger returns a new Merger func NewMerger(lists [][]*Item, sorted bool, tac bool) *Merger { mg := Merger{ lists: lists, merged: []*Item{}, + chunks: nil, cursors: make([]int, len(lists)), sorted: sorted, tac: tac, @@ -41,12 +55,20 @@ func (mg *Merger) Length() int { // Get returns the pointer to the Item object indexed by the given integer func (mg *Merger) Get(idx int) *Item { + if mg.chunks != nil { + if mg.tac { + idx = mg.count - idx - 1 + } + chunk := (*mg.chunks)[idx/ChunkSize] + return (*chunk)[idx%ChunkSize] + } + if mg.sorted { return mg.mergedGet(idx) } if mg.tac { - idx = mg.Length() - idx - 1 + idx = mg.count - idx - 1 } for _, list := range mg.lists { numItems := len(list) |