Python文本文件处理速度问题

Python文本文件处理速度问题,第1张

概述我在 Python中处理大量文件时遇到问题.我所做的一切都是 f = gzip.open(pathToLog, 'r')for line in f: counter = counter + 1 if (counter % 1000000 == 0): print counterf.close 这需要大约10m25s才能打开文件,读 我在 Python中处理大量文件时遇到问题.我所做的一切都是
f = gzip.open(pathTolog,'r')for line in f:        counter = counter + 1        if (counter % 1000000 == 0):                print counterf.close

这需要大约10m25s才能打开文件,读取行并增加此计数器.

在perl中,处理相同的文件并做了相当多的(一些正则表达式的东西),整个过程大约需要1m17s.

Perl代码:

open(LOG,"/bin/zcat $logfile |") or dIE "Cannot read $logfile: $!\n";while (<LOG>) {        if (m/.*\[svc-\w+\].*login result: Successful\.$/) {                $_ =~ s/some regex here/,,,/;                push @an_array,$_        }}close LOG;

任何人都可以建议我可以做什么来使Python解决方案以与Perl解决方案相似的速度运行?

编辑
我已经尝试只是解压缩文件,并使用open而不是gzip.open来处理它,但这只会将总时间改变为4m14.972s,这仍然太慢.

我还删除了模数和打印语句,并将其替换为pass,因此现在所做的一切都是从文件到文件.

解决方法 在Python(至少<= 2.6.x)中,gzip格式的解析是在Python中实现的(在zlib上).更重要的是,它似乎在做一些奇怪的事情,即解压缩到文件的最后到内存,然后丢弃超出所请求的读取大小的所有内容(然后再次进行下一次读取).免责声明:我刚刚看了gzip.read()3分钟,所以我可能在这里错了.无论我对gzip.read()的理解是否正确,gzip模块似乎没有针对大型数据卷进行优化.尝试在Perl中执行相同的 *** 作,即启动外部进程(例如,参见模块子进程). 编辑
实际上,我错过了OP的关于普通文件I / O的说法与压缩一样慢(感谢ire_and_curses指出它).这使我不可能,所以我做了一些测量…
from timeit import Timerdef w(n):    L = "*"*80+"\n"    with open("ttt","w") as f:        for i in xrange(n) :            f.write(L)def r():    with open("ttt","r") as f:        for n,line in enumerate(f) :            if n % 1000000 == 0 :                print ndef g():    f = gzip.open("ttt.gz","r")    for n,line in enumerate(f) :        if n % 1000000 == 0 :        print n

现在,运行它…

>>> Timer("w(10000000)","from __main__ import w").timeit(1)14.153118133544922>>> Timer("r()","from __main__ import r").timeit(1)1.6482770442962646# here i switched to a terminal and made ttt.gz from ttt>>> Timer("g()","from __main__ import g").timeit(1)

…并且休息一下,发现它还在运行,我杀了它,对不起.然后我尝试了100’000行而不是10’000’000:

>>> Timer("w(100000)","from __main__ import w").timeit(1)0.05810999870300293>>> Timer("r()","from __main__ import r").timeit(1)0.09662318229675293# here i switched to a terminal and made ttt.gz from ttt>>> Timer("g()","from __main__ import g").timeit(1)11.939290046691895

模块gzip的时间是O(file_size ** 2),所以数量级数百万,gzip读取时间不能与平常读取时间相同(我们看到一个实验确认).匿名,请重新检查.

总结

以上是内存溢出为你收集整理的Python文本文件处理速度问题全部内容,希望文章能够帮你解决Python文本文件处理速度问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1206849.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存