我有一个很久以前制作的500 MB文本文件。它看起来像html或xml标签,但它们在整个文件中并不一致。我试图找到两个不匹配的标签之间的信息。我目前使用的是什么,但速度很慢:myDict中有一个关键字列表。我只能保证X +键和/ N存在。没有其他标签是一致的。字典有18000个键。
for key in myDict:
start_position = 0
start_position = the_whole_file.find('<X>'+key, start_position)
end_position = the_whole_file.find('</N>', start_position)
date = the_whole_file[start_position:end_position]
有没有办法更快地完成这项工作?
答案 0 :(得分:2)
改变你的方式,而不是遍历字典并搜索潜在的匹配。迭代潜在的匹配并搜索字典
import re
for part in re.findall("\<X\>(.*)\<\/N\>",the_whole_text):
key = part.split(" ",1)[0]
if key in my_dict:
do_something(part)
因为字典查找是O(1)
而不是字符串查找O(N)
(搜索整个文件的每个密钥都很昂贵......)
因此,搜索文件内容为~O(500,000,000)
,而您正在进行18,000次
这样你只有在找到所有潜力后才搜索文件...然后你查找每个文件以查看它是否在你的数据字典中
答案 1 :(得分:0)
您始终可以逐行读取文件,而不是将整个文件存储在内存中:
inside_tag = False
data = ''
with open(your file, 'r') as fil:
for line in fil:
if '</N>' in line:
data += line.split('<X>')[0]
print data
inside_tag = False
if inside_tag:
data += line
if '<X>' in line:
data = line.split('<X>')[-1]
inside_tag = True
请注意,当开始和结束标记位于同一行时,这不起作用。