func load(prefixLen int, verbose bool, cn string) *markovianomatic.Chain { _, dbc := model.Connect(cn) lc, _ := dbc.Count() fmt.Fprintf(os.Stdout, "Using %s with %d prefixes\n", cn, lc) var c *markovianomatic.Chain c = markovianomatic.NewChain(prefixLen, verbose, cn) loadChain(c, dbc) return c }
// Save method persist (save or update) the chain on the disk func (c *Chain) Save() { var cn = c.collection if c.collection == "" { cn = timeName() c.collection = cn } sess, coll := model.Connect(cn) defer sess.Close() ks := c.Keys() sort.Strings(ks) var wg sync.WaitGroup var workForce = 5 ch := make(chan model.NewNodeInfo, workForce) for i := 0; i < workForce; i++ { wg.Add(1) go func() { defer wg.Done() var ni model.NewNodeInfo var more bool for { ni, more = <-ch if more { model.NewNode(ni).Save(coll) } else { return } } }() } count := len(ks) bar := uiprogress.AddBar(count) bar.AppendCompleted() bar.PrependElapsed() bar.PrependFunc(func(b *uiprogress.Bar) string { return fmt.Sprintf("Node (%d/%d)", b.Current(), count) }) uiprogress.Start() for _, x := range ks { ch <- model.NewNodeInfo{x, c.chain[x]} bar.Incr() } uiprogress.Stop() close(ch) wg.Wait() }