Linux 下遍历大文件每一行的最佳方法,最好是命令

2015-12-05 10:46:00 +08:00
 vus520
via: http://liuzhiqiangruc.iteye.com/blog/1454797

原始需求是想监控文件增加的每一行,传给外部程序处理。

实际上的办法是定时遍历文件的每行,再传给外部程序处理。
5323 次点击
所在节点    问与答
94 条回复
msg7086
2015-12-06 07:33:36 +08:00
好好的 V2EX 搞得乌烟瘴气,能不能消停下?
xufang
2015-12-06 08:50:14 +08:00
@msg7086 一开始我回帖是很平和的哦

结果小学生学艺不精不自量力喷我反被喷

怪我咯?
RemRain
2015-12-06 12:22:57 +08:00
@xufang
LZ 的需求是: 1. 监控文件增加的每一行; 2. 简单的字符串替换; 3. 最好是命令行

需求里面监控文件增加才是难点,字符串替换怎么来都不是问题,所以楼下的建议都是 tail -f 作监控,管道来处理字符串替换,你这假装很有经验,不给出有帮助的回答并强行与所有人撕逼是为哪般?


另外你答的几个看起来很厉害,实际没任何用的技术点,我可以给你分析下:

1. awk 比 Perl 快, LZ 没用对, ChinaUnix 上很多人可以给出更快的方案

事实上在文本简单处理上,各语言在效率上没有太大差异,处理速度完全取决于 IO 操作。 Linux 是有文件缓存的, LZ 之所以发现 Perl 比 awk 快,很有可能是 awk 后文件被缓存了一部分,之后 Perl IO 操作变快了。不看脚本内容,直接断言 LZ 没用对,而且不说哪里不对,说明你压根没意识到文件缓存的问题,或者说不知道有这个东西。

2. 脚本写得再高效,只能单核运行,应该用 golang , golang 天然支持多核

我以为 LZ 需求的效率取决于 IO 性能是有目共睹的,多核处理并不能加快 IO 处理速度,@5thcat 已经说明了。你回复说`你能在等 IO 的时候,把 CPU 也用上吗?` 我反问你一句,你把 CPU 都用上了,就不用等 IO 吗?

3. golang 的正则引擎秒杀很多脚本语言,打了很多语言的脸

那又如何? LZ 关心的是遍历,标题说明了,回复中也强调了。正则引擎快有啥用?另外真计较性能的话,你不觉得应该用普通的字符串查找、替换函数吗?锤子是好使,可这是螺丝啊
xufang
2015-12-06 12:25:41 +08:00
@RemRain 有一个看贴不回帖了,我的反复讲过,并行的好处就可把正则运算这部分工作摊到等 IO 时间做。

懂了吗?
xufang
2015-12-06 12:26:36 +08:00
我敢打赌,你们这些乱喷的小学生根本没看我贴的两篇的文章。
RemRain
2015-12-06 12:32:48 +08:00
@xufang 什么叫看贴不回帖?为何要用正则运算?你承认不知道文件缓存了?
xufang
2015-12-06 12:34:29 +08:00
@RemRain 为什么要用正则运算?自己去看楼主的原贴。

在我看来你才不知道呢,你千万别又 low 到这种程度。
xufang
2015-12-06 12:35:59 +08:00
只会爬楼,不看各楼引用的帖子,真是够了。我下午还要出去玩,有什么干货赶紧说。
RemRain
2015-12-06 12:43:15 +08:00
@xufang 可字符串查找、替换之类的函数更简单更快啊。另外,还是请教下,什么叫看贴不回帖?
xufang
2015-12-06 12:45:23 +08:00
@RemRain 所以你这个说法我们反对啊。不过即使查找替换也是 CPU 操作不是。

但是一般业务用正则更普遍,所以我就安利了 golang 的正则引擎。

刚才打快了,是回帖不看贴哦。
xufang
2015-12-06 12:45:49 +08:00
s/我们反对 /我没反对 /
xufang
2015-12-06 13:02:23 +08:00
出门了,最后我甩个半干货出来。

并行处理存在理论上的优势,但是实现的时候要考虑 locality 的问题, golang 还有 gc 方面需要针对性优化。

总之,知易行难。写代码其实是个技术活。
xufang
2015-12-06 21:48:35 +08:00
周末在这贴帖子我关注了两天,最终还是没有人提到 parallel 命令,这个让我进一步确认了在 V2EX 的技术自信
https://en.wikipedia.org/wiki/GNU_parallel

parallel 命令的思想和我说的这个初衷类似,不过有两点毛病
1. 需要处理的数据行要上下文无关。
2. 最要命的是 locality 不行,进程间通信比 golang 实现的原子操作慢多了。

不过,在 CPU 操作很密集的情况下,不愿意自己撸代码的,可以考虑用它。
xufang
2015-12-06 21:49:48 +08:00
最后送本楼乱喷我的小学生们一句话,除了对新技术保持谦虚之外,回帖要看贴。

以上。

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

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

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

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

© 2021 V2EX