go 爬虫 cpu 占用 99%内存占用还好要怎么改?

2018-08-02 18:01:02 +08:00
 zarte

用的是 surfer 下载正则循环匹配关键词等规则匹配连接,抓取文章。 一百多个网站,词有几千个。

2846 次点击
所在节点    Go 编程语言
10 条回复
owenliang
2018-08-02 18:24:58 +08:00
几个 cpu,什么型号。
fcten
2018-08-02 18:42:11 +08:00
这种情况 99%是正则写的有问题

参考 https://blog.csdn.net/ityouknow/article/details/80851338
gamexg
2018-08-02 20:01:17 +08:00
不先看看哪些函数占用 cpu 高?
google go pprof

大量关键字匹配
google 大量 关键字 匹配 算法
FanWall
2018-08-02 20:03:41 +08:00
同怀疑正则的问题
regicide
2018-08-02 20:23:23 +08:00
ac 自动机?
zarte
2018-08-03 09:17:35 +08:00
@fcten 谢谢我看下
zarte
2018-08-03 09:19:02 +08:00
@gamexg 谢谢
wkc
2018-08-03 13:14:51 +08:00
golang 的正则实现是线性时间复杂度的

参见文档 https://golang.org/pkg/regexp/
> The regexp implementation provided by this package is guaranteed to run in time linear in the size of the input.
zarte
2018-08-03 15:58:03 +08:00
@gamexg
pprof 这个生成的文件是空的呀,没有错误提示,咋整?

main{
。。。。
f, err := os.Create("mains")
if err != nil {
log.Fatal(err)
}
fmt.Println(f)
// 开启 CPU profiling
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
gamexg
2018-08-03 16:11:46 +08:00
@zarte #9

我平常是这么做的,代码里面加上下面的内容:

import _ "net/http/pprof"

go func() {
log.Println( http.ListenAndServe("localhost:6060", nil))
}()

然后需要分析性能时直接运行下面的命令:

分析 cpu 占用:go tool pprof --web 编译出来的文件.exe http://127.0.0.1:6060/debug/pprof/profile
分析内存占用:go tool pprof -inuse_space --web 编译出来的文件.exe http://127.0.0.1:6060/debug/pprof/heap

可以直接生成 SVG 调用图,很清晰。图是使用 graphviz 生成的,需要在本机安装 graphviz。
如果没有 graphviz,可以去掉 --web 参数,是 cmd 版本。

线上环境推荐这种方式,另外可以浏览器访问 http://127.0.0.1:6060/debug/pprof,里面有不少有用的内容。

如果本身有 http 服务,可以看下 net/http/pprof init() 函数代码,可以照着合并到已有的 http 服务内。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/476368

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX