讨论:如何提高perl处理大文件的效率

讨论:如何提高perl处理大文件的效率

Perl最常用的功能之一是处理文本,它内嵌的强大正则表达式是其他语言难以匹敌的,然而,如果使用不当,在处理大文件时(例如我这里的应用程序产生的日志,每天加起来有好几个G),效率会非常底下。下面我总结几个处理这些大文件提高效率的规律,欢迎大家补充:
1)处理文本文件,一般是逐行读入,在这样的循环里,绝不要使用外部shell命令,例如,假如要将分析内容写往其他文件,那么该老老实实的使用perl自己的写文件句柄的方式,而不要使用shell的"echo $_ >;file"之类的命令,后者比前者慢10000倍。
2)在匹配正则表达式时,如果匹配里含有"&"字符,那么记得在前面加个"\"转义,否则perl会把匹配的内容复制一份以供以后参考,这导致程序其慢无比;
3)在匹配正则表达式时,尽量不要使用i选项(区分大小写),请将不区分大小写的区域尽量缩小,例如/ID=something\&/i,如果只对ID不分大小写的话,那么应该这么写:/[Ii][Dd]=something\&/,后者比前者快不止100倍;
4)在匹配正则表达式时,如果匹配项是固定不变的,那么请使用o选项,这表示只对正则表达式编译一次,例如/jsp/io比/jsp/i好很多。

其他,欢迎补充...
5)while循环要比for/foreach循环效率高,
6)多用小括号,少用$&,$`,$'
7)多余多行匹配推荐用s/m修饰符,不推荐使用$*
尽量精确匹配
用while果然比foreach快多了,用foreach我的程序根本动不了
其实提高效率的原则无非是两点:
1、选择正确的算法
2、选择合适的实现

所谓合适的实现,从效率的角度来说就是所做的无用功做小的实现,这需要你对所用语言/工具的实现有比较深入的了解。
非常感谢,正在考虑大文件处理的问题,看到这些总结受益匪浅!
谢谢,学习 了
不错,明了很多,一直没总结


QUOTE:
原帖由 pyh 于 2005-5-12 09:26 发表
Perl最常用的功能之一是处理文本,它内嵌的强大正则表达式是其他语言难以匹敌的,然而,如果使用不当,在处理大文件时(例如我这里的应用程序产生的日志,每天加起来有好几个G),效率会非常底下。下面我总结几 ...

别一般了,最好都是逐行读入!
我一次性读入一个2G文件到内存,慢的要死!
其实地道的 unix 黑客都会直接 print 到 STDOUT 的 unless 一次运行将生成多个文件。
至于那个 & 和 \&,我没看懂是啥意思。