首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的代码停止了?

为什么我的代码停止了?
EN

Stack Overflow用户
提问于 2010-09-01 07:58:50
回答 6查看 303关注 0票数 2

嘿,我遇到了一个问题,我的程序在57802记录处停止了对文件的迭代,因为某种原因,我不能确定。我放了一个心跳部分,这样我就可以看到它在哪一行上,这很有帮助,但现在我卡住了,为什么它会停在这里。我认为这是一个内存问题,但我只是在我的6 6GB内存的计算机上运行它,它仍然停止。

有没有更好的方法来做下面我正在做的事情?我的目标是读取该文件(如果您需要我将其发送给您,我可以15MB文本日志),根据regex表达式找到一个匹配项,并打印匹配的行。还会有更多,但这就是我所得到的。我使用的是python 2.6

任何想法和代码注释都会有帮助!我是一名蟒蛇新手,还在学习。

代码语言:javascript
复制
import sys, os, os.path, operator
import re, time, fileinput

infile = os.path.join("C:\\","Python26","Scripts","stdout.log")

start = time.clock()

filename  = open(infile,"r")

match = re.compile(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d{3} +\w+ +\[([\w.]+)\] ((\w+).?)+:\d+ - (\w+)_SEARCH:(.+)')

count = 0
heartbeat = 0
for line in filename:
    heartbeat = heartbeat + 1
    print heartbeat
    lookup = match.search(line)
    if lookup:
        count = count + 1
        print line
end = time.clock()
elapsed = end-start
print "Finished processing at:",elapsed,"secs. Count of records =",count,"."

filename.close()

这是第57802行,它失败了:

代码语言:javascript
复制
2010-08-06 08:15:15,390 DEBUG [ah_admin] com.thg.struts2.SecurityInterceptor.intercept:46 - Action not SecurityAware; skipping privilege check.

这是一个匹配的行:

代码语言:javascript
复制
2010-08-06 09:27:29,545 INFO  [patrick.phelan] com.thg.sam.actions.marketmaterial.MarketMaterialAction.result:223 - MARKET_MATERIAL_SEARCH:{"_appInfo":{"_appId":21,"_companyDivisionId":42,"_environment":"PRODUCTION"},"_description":"symlin","_createdBy":"","_fieldType":"GEO","_geoIds":["Illinois"],"_brandIds":[2883],"_archived":"ACTIVE","_expired":"UNEXPIRED","_customized":"CUSTOMIZED","_webVisible":"VISIBLE_ONLY"}

仅前5行的样本数据:

代码语言:javascript
复制
2010-08-06 00:00:00,035 DEBUG [] com.thg.sam.jobs.PlanFormularyLoadJob.executeInternal:67 - Entered into PlanFormularyLoadJob: executeInternal
2010-08-06 00:00:00,039 DEBUG [] com.thg.ftpComponent.service.JScapeFtpService.open:153 - Opening FTP connection to sdrive/hibbert@tccfp01.hibbertnet.com:21
2010-08-06 00:00:00,040 DEBUG [] com.thg.sam.email.EmailUtils.sendEmail:206 - org.apache.commons.mail.MultiPartEmail@446e79
2010-08-06 00:00:00,045 DEBUG [] com.thg.sam.services.OrderService.getOrdersWithStatus:121 - Orders list size=13
2010-08-06 00:00:00,045 DEBUG [] com.thg.ftpComponent.service.JScapeFtpService.open:153 - Opening FTP connection to sdrive/hibbert@tccfp01.hibbertnet.com:21
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-01 16:50:42

你的问题肯定是@paulrubel指出的部分:

代码语言:javascript
复制
((\w+).?)+:\d+

现在您已经添加了示例数据,很明显,.应该匹配一个文字点,这意味着您应该对它进行转义(\.)。此外,您不需要内部的括号集,外部的集应该是非捕获的,但它的基本结构正在杀死您;在放弃之前,它必须尝试太多的单词字符和点的排列。在尝试执行该部分正则表达式之前,其他行都会失败,这就是为什么使用它们没有任何问题的原因。

当我在RegexBuddy中尝试它时,您的正则表达式在186步中匹配了good行,并且在经过1,000,000步后放弃了在第57802行上的尝试。当我转义点时,正确的行只需要90步就可以匹配,但它仍然在第57802行超时。但是现在我知道regex的一部分只能匹配单词字符和点。一旦它消耗了所有这些,下一个比特就必须与:\d+匹配;如果不匹配,我知道尝试其他安排是没有意义的。我可以使用一个原子组来告诉它不要麻烦:

代码语言:javascript
复制
(?>(?:\w+\.?)+):\d+

有了这一变化,正确的行在83个步骤中匹配,而第57802行只需要66个步骤就可以报告故障。但是使用原子组并不总是可行的,所以您应该尝试使您的正则表达式符合它所匹配的文本的实际结构。在本例中,您将匹配看起来像Java类名的名称(一些单词字符,后跟零个或多个实例(一个点和一些更多单词字符),后跟冒号和行号:

代码语言:javascript
复制
\w+(?:\.\w+)*:\d+

当我将其插入到正则表达式中时,它在80步内匹配了good行,并在67步中拒绝了57802行--原子组甚至不需要。

票数 2
EN

Stack Overflow用户

发布于 2010-09-01 08:26:15

给你带来麻烦的输入行是什么样子的?我会试着把它打印出来。我怀疑你的CPU在运行的时候被挂住了。

像你这样的嵌套正则表达式,当它们不能快速匹配时,可能会导致VERY性能下降。

代码语言:javascript
复制
((\w+).?)+:

假设一个字符串中没有:,但却相当长。当regexp尝试每种方法组合来分隔\w和之间的单词字符时,您将陷入一个回溯的世界。然后尝试以各种可能的方式对它们进行分组。如果你能在你的模式中更具体,这将会有很大的回报。

票数 7
EN

Stack Overflow用户

发布于 2010-09-01 08:36:54

您编译了您的正则表达式,但从未使用过它?

代码语言:javascript
复制
lookup = re.search(match,line)

应该是

代码语言:javascript
复制
lookup = match.search(line)

并且您应该使用os.path.join()

代码语言:javascript
复制
infile = os.path.join("C:\\","Python26","Scripts","stdout.log")

更新:

您的正则表达式可以是simpler.Just检查日期和时间戳。否则,请不要使用正则表达式。假设您的日期和时间从行首开始

代码语言:javascript
复制
for line in open("stdout.log"):
    s = line.split()
    D,T=s[0],s[1]
    # use the time module and strptime to check valid date/time
    # or you can split "-" on D and T and do manual check using > or < and math
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3614075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档