【发布时间】:2014-06-09 18:14:54
【问题描述】:
编辑:任何人在未来来到这个,我使用的解决方案是切换到 cElementTree。它不仅使用更少的内存运行,而且速度明显更快。
这适用于最大约 600mb 大小的文件,大于此大小并且我的内存不足(我有一台 16gb 的机器)。我可以做些什么来分段读取文件,或者一次读取一定百分比的 xml,或者是否有一种内存密集度较低的方法?
import csv
import xml.etree.ElementTree as ET
from lxml import etree
import time
import sys
def main(argv):
start_time = time.time()
#file_name = 'sample.xml'
file_name = argv
root = ET.ElementTree(file=file_name).getroot()
csv_file_name = '.'.join(file_name.split('.')[:-1]) + ".txt"
print '\n'
print 'Output file:'
print csv_file_name
with open(csv_file_name, 'w') as file_:
writer = csv.writer(file_, delimiter="\t")
header = [ <the names of the tags here> ]
writer.writerow(header)
tags = [
<bunch of xml tags here>
]
#write the values
# for index in range(8,1000):
for index in range(3,len(root)):
#print index
row=[]
for tagindex,val in enumerate(tags):
searchQuery = "tags"+tags[tagindex]
# print searchQuery
# print root[index]
# print root[index].find(searchQuery).text
if (root[index].find(searchQuery) is None) or (root[index].find(searchQuery).text == None):
row.extend([""])
#print tags[tagindex]+" blank"
else:
row.extend([root[index].find(searchQuery).text])
#print tags[tagindex]+" "+root[index].find(searchQuery).text
writer.writerow(row)
#for i,child in enumerate(root):
#print root[i]
print '\nNumber of elements is: %s' % len(root)
print '\nTotal run time: %s seconds' % (time.time() - start_time)
if __name__ == "__main__":
main(sys.argv[1])
【问题讨论】:
-
你试过cElementTree(C实现)吗?只需将您的 ET 导入语句替换为:
import xml.etree.cElementTree as ET -
如此简单的修复,这似乎使用了非常少的内存。请回复为答案,以便我接受。
-
这并没有回答这个问题,即知道如何以块的形式读取 XML 数据,而不是将整个文件加载到内存中。也就是说,很高兴知道 C 实现在内存消耗方面也更有效。
-
虽然它没有回答问题,但它非常清楚地解决了我遇到的问题。
-
很高兴知道您的问题已解决。
标签: python xml elementtree