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

标签 python regex memory

您好,我正在处理一个 600Mb 的文件。我写了下面的代码。我正在做的是,在 <dest> 之间的数据中搜索关键字标签,如果存在,则将城市标签添加到 <dest>标签。它对于小数据集运行良好,但是当我在大文件上运行该程序时,它会抛出内存错误。我想当我在 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)

最佳答案

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

我得到的内存使用量是文件大小的 3 倍,这意味着如果您没有(超过)2GB,您将收到 MemoryError。这是合理的——或者至少我能猜到原因。这就是 re.sub() 的工作原理。

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

关于Python 函数返回语句期间出现内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15290375/

相关文章:

c++ - 函数导致巨大的内存泄漏?

c - 将 union 中的结构修改为 union 中的其他值而不进行复制

python - Scrapy 和 Pycharm - Stange 导入错误 - 没有名为 [在此处插入 scrapyproject 的名称] 的模块

python - 为什么我的导入时间报错 module object is not callable

python - 由于导入机制导致 isinstance() 和 type() 等价失败(python/django)

Python mmap 对象提示 Python 3.5.2 上的字符串模式(不在 Python 2.6.6 中)

regex - 使用 unix 重命名来保留任意数字

python - 如何在 C++ 中标记字符串(如 Python 中的 ply.lex)?

python - 从字符串列表中计算最接近的字符串匹配

c++ - vector c++ vector 的大小