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