1

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

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)
4

1 回答 1

2

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

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

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

于 2013-03-09T01:39:28.597 回答