2022-08-23 15:07:06 +02:00
|
|
|
package obiformats
|
|
|
|
|
|
|
|
import (
|
|
|
|
"log"
|
|
|
|
|
2023-11-29 12:14:37 +01:00
|
|
|
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiiter"
|
|
|
|
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiutils"
|
2022-08-23 15:07:06 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
func ReadSequencesBatchFromFiles(filenames []string,
|
|
|
|
reader IBatchReader,
|
|
|
|
concurrent_readers int,
|
2023-01-22 22:04:17 +01:00
|
|
|
options ...WithOption) obiiter.IBioSequence {
|
2022-08-23 15:07:06 +02:00
|
|
|
|
|
|
|
if reader == nil {
|
2022-11-16 17:13:03 +01:00
|
|
|
reader = ReadSequencesFromFile
|
2022-08-23 15:07:06 +02:00
|
|
|
}
|
|
|
|
|
2023-03-27 19:51:10 +07:00
|
|
|
batchiter := obiiter.MakeIBioSequence()
|
2023-03-24 10:25:12 +07:00
|
|
|
nextCounter := obiutils.AtomicCounter()
|
2022-08-23 15:07:06 +02:00
|
|
|
|
|
|
|
batchiter.Add(concurrent_readers)
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
batchiter.WaitAndClose()
|
|
|
|
log.Println("Finnished to read every files")
|
|
|
|
}()
|
|
|
|
|
|
|
|
filenameChan := make(chan string)
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
for _, filename := range filenames {
|
|
|
|
filenameChan <- filename
|
|
|
|
}
|
|
|
|
|
|
|
|
close(filenameChan)
|
|
|
|
}()
|
|
|
|
|
|
|
|
for i := 0; i < concurrent_readers; i++ {
|
|
|
|
go func() {
|
|
|
|
|
|
|
|
for filename := range filenameChan {
|
|
|
|
iter, err := reader(filename, options...)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
log.Panicf("Cannot open file %s : %v", filename, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Printf("Start reading of file : %s", filename)
|
|
|
|
|
|
|
|
for iter.Next() {
|
|
|
|
batch := iter.Get()
|
|
|
|
batchiter.Push(batch.Reorder(nextCounter()))
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Printf("End of reading of file : %s", filename)
|
|
|
|
|
|
|
|
}
|
|
|
|
batchiter.Done()
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
|
|
|
|
return batchiter
|
|
|
|
}
|