Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数返回语句期间出现Python内存错误_Python_Regex_Memory - Fatal编程技术网

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

函数返回语句期间出现Python内存错误,python,regex,memory,Python,Regex,Memory,嗨,我正在处理一个600Mb的文件。我已经写了下面的代码。我正在做的是,在标记之间的数据中搜索关键字,如果它存在,则将城市标记添加到标记中。对于小数据集,它工作得很好,但当我在大文件上运行程序时,它抛出了内存错误。当我在if条件中使用return语句时,我猜我遇到了这个错误。有人能告诉我如何解决这个问题吗 import re def casp ( tx ): def tbcnv( st ): ct = '' prt = re.compile(r"(?i)

嗨,我正在处理一个600Mb的文件。我已经写了下面的代码。我正在做的是,在
标记之间的数据中搜索关键字,如果它存在,则将城市标记添加到
标记中。对于小数据集,它工作得很好,但当我在大文件上运行程序时,它抛出了内存错误。当我在
if条件中使用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)
重新导入
def casp(tx):
def tbcnv(st):
ct=“”
prt=re.compile(r“(?i)(纸条副本,.*?\)”,re.DOTALL | re.M)
val=重新搜索(prt,st)
尝试:
ct=val.group(1)
如果重新搜索(r“(?i)阿拉斯加”,ct):
jval=“阿拉斯加”
打印jval
如果jval:
prt=re.compile(r“(?i)(.*),re.DOTALL | re.M)
vl=re.sub(prt,“\\1\n”+”“+jval+”+“\n”,st)
返回vl
其他:
返回街
其他:
返回街
除:
打印“不可用”
返回街

pt=re.compile(“(?i)(如果在
expect
之前删除
return
语句,那么
re.sub()
生成的字符串要小得多

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


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

我猜在一个600M文件上运行正则表达式可能是内存错误的原因…逐行读取文件,
Read()
将立即将整个文件放入内存,这可能会导致此错误。@AshwiniChaudhary我需要捕获多行中两个标记之间的日期。这是
xml
文件吗?如果是,请使用适当的迭代解析器,如
lxml.etree.iterparse
使用
return 声明…你能提供更多的数据说明你为什么怀疑吗?我似乎不太可能是先验的。