函数返回语句期间的Python内存错误

时间:2013-03-08 09:11:26

标签: python regex memory

您好我正在处理600Mb文件。我写了下面的代码。我要做的是,在<dest>标记之间的数据中搜索关键字,如果存在,则将城市标记添加到<dest>标记。它适用于一小组数据,但是当我在大文件上运行程序时,它会抛出MEMORY ERROR。我想我在if condition中使用return语句时会收到此错误,任何人都可以告诉我如何解决这个问题?

import re

def casp ( tx ):
    def tbcnv( st ):
        ct = ''
        prt = re.compile(r"(?i)(Slip Copy,.*?\))", re.DOTALL|re.M)
        val = re.search(prt, st)
        try:
            ct = val.group(1)
            if re.search(r"(?i)alaska", ct):
                jval = "Alaska"
                print jval
                if jval:
                    prt = re.compile(r"(?i)(.*?<dest.*?>)", re.DOTALL|re.M)
                    vl = re.sub(prt, "\\1\n" +  "<city>" + jval + "</city>" + "\n" ,st)
                    return vl
                else:
                    return st
            else:
                return st
        except:
            print "Not available"
            return st   

    pt = re.compile("(?i)(<dest.*?</dest>)", re.DOTALL|re.M)
    t = re.sub(pt, lambda m: tbcnv(m.group(1)), tx)
    return t

with open('input.txt', 'r') as content_file:
    content = content_file.read()
    pt = re.compile(r"(?i)<Lrlevel level='3'>(.*?)</Lrlevel>", re.DOTALL|re.M)
    content = re.sub(pt,lambda m: "<Lrlevel level='3'>" + casp(m.group(1) + "</Lrlevel>" ), content)

with open('out.txt', 'w') as out_file:
    out_file.write(content)

1 个答案:

答案 0 :(得分:2)

如果您删除return之前的expect语句,则re.sub()构建的字符串要小得多。

我的内存使用量是文件大小的3倍,这意味着如果你没有(超过)2GB,你会得到一个MemoryError。这在这里是合理的 - 或者至少我可以猜到为什么。这就是re.sub()的工作原理。

这意味着您正在以某种方式使用错误的工具,如上面的评论中所述。您应该使用像lxml这样的完整xml处理工具,或者如果你想坚持使用正则表达式,找到一种永远不需要内存中整个字符串的方法;或者至少永远不要在其上调用re.sub()(例如,只有tx变量包含一个大字符串,这是输入;并且你在循环中执行pt.search(tx, startpos),将地点定位到改变,逐句写tx}。