Я написал программу для вычисления оценок сходства между запросом и целевым документом. Эскиз, как показано ниже:
type Dictionary struct {
Documents map[int][]string
Queries map[int][]string
}
type Similarity struct {
QID int
DocID int
Sim float64
}
func (dict * Dictionary) CalScore(qID, docID int) float64 {
query := dict.Queries[qID]
document := dict.Documents[docID]
score := calculation(query, document) // some counting and calculation
// for example: count how many words in query are also in document and so on,
// like tf-idf things.
return score
}
// Calculate the similarity scores for each group.
func SimWorker(index int, dict *Dictionary, simsList *[][]Similarity, wg *sync.WaitGroup) {
defer wg.Done()
for i, sim := range (*simsList)[index] {
// Retrieving words from Dictionary and compute, pretty time consuming.
(*simsList)[index][i].Sim = dict.CalScore(dict.Queries[sim.QID], dict.Documents[sim.DocID])
}
}
func main() {
dict := Dictionary{
// All data filled in.
}
simsList := [][]Similarity{
// Slice of groups of structs containing
// pairs of query id and doc id.
// All sims scores are 0.0 initially.
}
var wg sync.WaitGroup
for i := range simsList {
wg.Add(1)
go SimWorker(i, &dict, &simsList, &wg)
}
wg.Wait() // wait until all goroutines finish
// Next procedures to the simsList
}
По сути, у меня есть фрагмент групп идентификаторов query-do c, идентификаторы запросов в каждой группе одинаковые, а идентификаторы do c разные. Процедура довольно проста, я просто получаю строки из словаря, а затем вычисляю счет, используя некоторые алгоритмы. Сначала я сделал все это по порядку (не используя горутины), и мне потребовалось несколько минут, чтобы вычислить баллы для каждой группы и всего несколько часов. Затем я ожидал некоторого улучшения скорости, введя goroutines, как описано выше. Я создал программу для каждой группы, так как они имеют доступ к различным частям в Dictionary
и [][]Similarity
. Но оказалось, что скорость не улучшилась и несколько уменьшилась (количество используемых мной программ составляет около 10). Почему это произошло и как я могу улучшить программу, чтобы фактически ускорить вычисления?