package main
import ( "bufio" "fmt" "io" "os" "regexp" "strings" "sync" )
func getDomain(cfg string) []string { data := make([]string, 0)
f, _ := os.Open(cfg)
defer f.Close()
scan := bufio.NewScanner(f)
for scan.Scan() {
data = append(data, scan.Text())
}
return data
}
func main() { domain := getDomain(os.Args[1])
data := make(chan string, 1024)
message := make(map[string]int)
wg := &sync.WaitGroup{}
f, _ := os.Open(os.Args[2])
defer f.Close()
br := bufio.NewReader(f)
for {
txt, err := br.ReadString('\n')
txt = strings.TrimSpace(txt)
if err == io.EOF {
break
}
wg.Add(1)
go func(s string, w *sync.WaitGroup) {
for _, i := range domain {
patt := "(.*)" + regexp.QuoteMeta("."+i) + "($)|" + "(^)" + i + "($)"
if b, _ := regexp.MatchString(patt, s); b {
data <- i
break
}
}
w.Done()
}(txt, wg)
}
wg1 := &sync.WaitGroup{}
wg1.Add(1)
go func(w1 *sync.WaitGroup) {
for {
d, ok := <-data
if !ok {
for k, v := range message {
fmt.Printf("%s:%d\n", k, v)
}
break
}
message[d]++
}
w1.Done()
}(wg1)
wg.Wait()
close(data)
wg1.Wait()
}
A 文件是要数据文件,B 文件包含查的关键字 目前 A 文件大概 180w 条数据,B 文件关键字 1200 多个
A 文件内容: tc.qq.com 1.tc.qq.com osfsr.lenovomm.com
B 文件内容: tc.qq.com a.com lenovomm.com
统计 B 文件中所有域名的请求次数,如果 A 文件中的域名属于 B 文件中域名的子域名或本身,均算入请求次数中
上面的例子最终应得到 tc.qq.com:2 次 a.com:0 次 lenovomm.com:1 次
现在执行很慢,想请教一下怎么优化。 具体慢到 A 文件包含 1000 条数据,B 文件包含 1100 条数据,执行花费了 17 秒。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.