您好我正在处理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)
答案 0 :(得分:2)
如果您删除return
之前的expect
语句,则re.sub()
构建的字符串要小得多。
我的内存使用量是文件大小的3倍,这意味着如果你没有(超过)2GB,你会得到一个MemoryError。这在这里是合理的 - 或者至少我可以猜到为什么。这就是re.sub()
的工作原理。
这意味着您正在以某种方式使用错误的工具,如上面的评论中所述。您应该使用像lxml这样的完整xml处理工具,或者如果你想坚持使用正则表达式,找到一种永远不需要内存中整个字符串的方法;或者至少永远不要在其上调用re.sub()
(例如,只有tx
变量包含一个大字符串,这是输入;并且你在循环中执行pt.search(tx, startpos)
,将地点定位到改变,逐句写tx
}。