【问题标题】:Efficient way of converting CSV file to XML file? [closed]将CSV文件转换为XML文件的有效方法? [关闭]
【发布时间】: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


【解决方案1】:

我不知道 Python 或 Minidom,但您似乎正在执行该行

dataRoot.appendChild(dataElt)

每行中的每个字段一次,而不是每行一次。

您的性能数据表明这里有问题,我不知道是不是这样。对于 2000 条记录,我希望以毫秒为单位测量时间。

不得不说,我经常惊讶于人们如何为这种事情编写复杂的过程代码,而这些代码可以用六行 XSLT 或 XQuery 来完成。

【讨论】:

猜你喜欢
  • 2021-01-03
  • 2014-07-24
  • 1970-01-01
  • 2011-03-05
  • 2015-10-28
  • 2014-11-22
  • 2017-04-18
  • 2020-03-21
相关资源
最近更新 更多