【发布时间】:2020-03-12 18:43:12
【问题描述】:
我编写了以下代码来将 CSV 文件转换为 XML 文件。输入文件有 1000 万条记录。问题是它运行了几个小时,有 1000 万条记录。如果像 2000 条这样的记录数量较少,则需要 5-10 秒。
有没有办法在更短的时间内高效完成?
import csv
import sys
import os
from xml.dom.minidom import Document
filename = sys.argv[1]
filename = os.path.splitext(filename)[0]+'.xml'
pathname = "/tmp/"
output_file = pathname + filename
f = sys.stdin
reader = csv.reader(f)
fields = next(reader)
fields = [x.lower() for x in fields]
fieldsR = fields
doc = Document()
dataRoot = doc.createElement("rowset")
dataRoot.setAttribute('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance")
dataRoot.setAttribute('xsi:schemaLocation', "./schema.xsd")
doc.appendChild(dataRoot)
for line in reader:
dataElt = doc.createElement("row")
for i in range(len(fieldsR)):
dataElt.setAttribute(fieldsR[i], line[i])
dataRoot.appendChild(dataElt)
xmlFile = open(output_file,'w')
xmlFile.write(doc.toprettyxml(indent = '\t'))
xmlFile.close()
sys.stdout.write(output_file)
【问题讨论】:
-
可能的问题是,使用这个库,您必须在写出之前在内存中创建整个树。有一些streaming writer solutions 供您探索。
-
我认为这个问题可以重新打开,但由于缺乏焦点而被关闭。您能否为此添加一些时序测量,以查看哪些代码增加了效率低下?我想知道您的 XML 编写器是否试图将所有内容都保存在 RAM 中,因此随着数据集大小的增加,效率会越来越低。
-
具体来说,对于 1000 万条记录,您认为多少时间是可接受的解决方案? 1 小时 1000 万条记录? 4个小时? 10分钟?试图避免将您当前的 8 小时时间框架缩短几分钟的答案...
-
注意:虽然您没有指定比“小时”更准确的信息来说明 10M 记录所需的时间,但这似乎是为了从“2000 年需要的时间”线性缩放时间要求5-10 秒”。如果2k条记录需要5s到10s,那么10M条记录应该需要25000s到50000s,也就是6.94h到13.89h。
标签: python xml performance csv