1

Make compatibility computation happen in go routine

This commit is contained in:
Alex Yatskov 2015-07-31 14:41:44 +09:00
parent 30ca2305b1
commit 9b771dc68e

34
util.go
View File

@ -26,6 +26,7 @@ import (
"log"
"math"
"strconv"
"sync"
"github.com/kellydunn/golang-geo"
)
@ -159,7 +160,7 @@ func project(entries records, features featureMap, modes modeMap, featureName st
return projection
}
func computeRecordGeo(entries records, context queryContext) {
func computeRecordsGeo(entries records, context queryContext) {
distUserMin := math.MaxFloat64
distUserMax := 0.0
@ -195,10 +196,7 @@ func computeRecordGeo(entries records, context queryContext) {
}
}
func computeRecordCompat(entries records, context queryContext) {
for index := range entries {
entry := &entries[index]
func computeRecordCompat(entry *record, context queryContext, wg *sync.WaitGroup) {
historyRows, err := db.Query("SELECT id FROM history WHERE reviewId = (?)", entry.id)
if err != nil {
log.Fatal(err)
@ -245,6 +243,28 @@ func computeRecordCompat(entries records, context queryContext) {
if groupCount > 0 {
entry.compatibility = groupSum / float64(groupCount)
}
wg.Done()
}
func computeRecordsCompat(entries records, context queryContext) {
count := len(entries)
limit := 32
for i := 0; i < count; i += limit {
batch := count - i
if batch > limit {
batch = limit
}
var wg sync.WaitGroup
wg.Add(batch)
for j := 0; j < batch; j++ {
go computeRecordCompat(&entries[i+j], context, &wg)
}
wg.Wait()
}
}
@ -296,8 +316,8 @@ func getRecords(context queryContext) records {
log.Fatal(err)
}
computeRecordCompat(entries, context)
computeRecordGeo(entries, context)
computeRecordsCompat(entries, context)
computeRecordsGeo(entries, context)
return entries
}