最近需要分析网络流量通过网关的网络连接数,读取系统文件/proc/net/nf_conntrack, 提取protocol, src, dst, dport,然后统计这些数据的条数,打印出最高的20条,大概的代码如下:
```go
type Entity struct{
Protocol string
Src string
Dst string
Dport string
}
mapIPinfo := make(map[Entity]int)
f, err := os.Open(filename)
reader, err := bufio.NewReader(f)
for(reader.Scan()){
var entity Entity
line := reader.Text()
... //这里对line提取protocol, src, dst, dport放到entity
mapIPinfo[entity]++
}
```
将protocol, src, dst, dport 放到到一个结构体里, 然后将结构体放到一个map中以进行统计和去重。
这样运行后总共要花的时间超过15分钟, 太慢了。
然后我将读取每行改成读取多行,然后放到一个sync.Pool中,使用一个goroutine去提取, 同样也要花8分钟, 也太慢了。 感觉最后对map排序花的时间比较多。
请问大家有没有更好的方法和建议, 谢谢。
hashmd5 := md5.New()
hashmd5.Write([]byte("Protocol" + "src" + "dst"))
key:=hex.EncodeToString(hashmd5.Sum(nil))
mapipinfo[key]++
不知道使用md5 能否减少对应的key 的大小,相比struct 是不是更节省内存
#12
更多评论
`mapIPinfo[entity]++`
这行代码惊呆了,我不相信这个东西能正常工作
其次,先说说文件多大,不然你都不知道是你的代码性能低,还是文件太大
#1