如何高效快速的读取超大文件

lccc · · 2119 次点击 · 开始浏览    置顶

最近需要分析网络流量通过网关的网络连接数,读取系统文件/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排序花的时间比较多。 请问大家有没有更好的方法和建议, 谢谢。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

2119 次点击  
加入收藏 微博
12 回复  |  直到 2022-04-13 13:37:54
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传