func queryGi2Taxid(dbFilePath string, queryType string, gis []string) { db, err := bolt.Open(dbFilePath, 0600, nil) defer db.Close() checkError(err) taxids, err := taxon.QueryGi2Taxid(db, queryType, gis) checkError(err) for i, gi := range gis { fmt.Printf("%s\t%s\n", gi, taxids[i]) } }
func queryGi2TaxidByFile(dbFilePath string, queryType string, dataFile string, chunkSize int, threads int) { if chunkSize <= 0 { chunkSize = 10000 } fn := func(line string) (interface{}, bool, error) { line = strings.TrimSpace(strings.TrimRight(line, "\n")) if line == "" { return "", false, nil } return line, true, nil } reader, err := breader.NewBufferedReader(dataFile, runtime.NumCPU(), chunkSize, fn) checkError(err) pool := taxon.NewDBPool(dbFilePath, threads) chResults := make(chan [][]string, threads) // receive result and print chDone := make(chan int) go func() { for s := range chResults { gis, taxids := s[0], s[1] for i, gi := range gis { fmt.Printf("%s\t%s\n", gi, taxids[i]) } } chDone <- 1 }() // querying var wg sync.WaitGroup tokens := make(chan int, threads) for chunk := range reader.Ch { if chunk.Err != nil { checkError(chunk.Err) break } tokens <- 1 wg.Add(1) gis := make([]string, len(chunk.Data)) for i, data := range chunk.Data { gis[i] = data.(string) } go func(gis []string) { db := pool.GetDB() defer func() { pool.ReleaseDB(db) wg.Done() <-tokens }() taxids, err := taxon.QueryGi2Taxid(db, queryType, gis) checkError(err) chResults <- [][]string{gis, taxids} }(gis) } wg.Wait() close(chResults) <-chDone }