XML 写入速度越来越慢



我想我以前把这个问题复杂化了。

将多个列表的内容写入 XML 文件。编写一个结果需要一毫秒,但 100 个结果几乎需要一分钟,这没有意义。我添加了一个计数器,每次写入都比上一次慢。

我找不到这方面的瓶颈。我不明白是什么减慢了它的速度,我离自己手动将数据写入记事本只有一丝之遥。

我试过:

*不检查 Temp.xml 存在以设置树/根,它没有区别。

*使用相同的列表而不是多个列表,以防万一导致奇怪的事情。

*我认为这可能只是我的系统,所以我把它放在 40 核疯狂级别的 SSD 服务器上,它有相同的结果。

代码:

def filewriter():
    while 1:
            time.sleep(10)
            if OnlyOneXMLWriteCheck == 1:
                WriteThatThread = Thread(target = FileWrite)
                WriteThatThread.start()
                WriteThatThread.join()
def FileWrite():
    try:
        if os.path.exists("Temp.xml") == True:
            os.remove("Temp.xml")
        EventDumpCounter = 0
        for Eventes in EventTags:
            try:
                if os.path.exists("Temp.xml") == True:
                    tree = ET.parse("Temp.xml")
                    root = tree.getroot()
                if os.path.exists("Temp.xml") == False:
                    root = ET.Element("Refunds")
                    tree = ET.ElementTree(root)
                if float(EventCost[EventDumpCounter]) > float(Price[EventDumpCounter]):
                    if "Horse" in EventTags[EventDumpCounter]:
                        Eventes = ET.SubElement(root, "Event", type = EventTags[EventDumpCounter])
                        ET.SubElement(Eventes, "EventTime").text = str(EventTimes[EventDumpCounter])
                        ET.SubElement(Eventes, "EventName").text = str(EventName[EventDumpCounter])
                        ET.SubElement(Eventes, "EventLoc").text = str(EventLoc[EventDumpCounter])
                        ET.SubElement(Eventes, "EventSpace").text = str(EventSpace[EventDumpCounter])
                        ET.SubElement(Eventes, "EventCost").text = str(EventCost[EventDumpCounter])
                        ET.SubElement(Eventes, "EventPrice").text = str(EventPrice[EventDumpCounter])
                        ET.SubElement(Eventes, "EventParking").text = str(EventParking[EventDumpCounter])
                        ET.SubElement(Eventes, "EventDist").text = str(EventDist[EventDumpCounter])
                        tree.write("Temp.xml")
                EventDumpCounter +=1
            except:
                print "Problem writing XML"
    #except:
    except WindowsError, e:
        print "Problem creating XML 2"
        #e = sys.exc_info()[0]
        print e
KeepWritingFiles = Thread(target = filewriter)
KeepWritingFiles.start()

/更新:

在下面的评论之后,有人建议每次解析XML都会减慢速度。我这样做是为了它可以启动一个新的 XML 或附加到现有的 XML,但我改成了这个:

   if os.path.exists("Temp.xml") == True:
            if OnlyParseOnce == 0:
                print "opening file"
                OnlyParseOnce = 1
                tree = ET.parse("Temp.xml")
                root = tree.getroot()
        if os.path.exists("Temp.xml") == False:
            root = ET.Element("Events")
            tree = ET.ElementTree(root)

"打开文件"只显示一次,这意味着它不会不断解析文件,而且速度仍然很慢。我想知道"os.path.exists"是否是瓶颈。

如果我手动设置它

 root = ET.Element("Refunds")
  tree = ET.ElementTree("Events")

它在一秒钟内飞过相同数量的数据。根本没有时间。但这样它就不会附加到现有文件中,而是不断重写。所以它可能是os.path.exist,或者只是因为我正在编写一个结果而不是创建一个更大的文件。

您的代码使用 tree.write("Temp.xml") 在每个循环结束时写入文档,然后使用 tree = ET.parse("Temp.xml") 再次读取和分析它。这是完全没有意义的,因为tree已经在内存中,不需要重建。随着文档的增长,写入和读取的成本上升,性能下降。只需使用内存中的 tree 对象并延迟写入,直到循环完成。

def FileWrite():
    try:
        if os.path.exists("Temp.xml") == True:
            os.remove("Temp.xml")
        root = ET.Element("Refunds")
        tree = ET.ElementTree(root)
        EventDumpCounter = 0
        for Eventes in EventTags:
            try:
                if float(EventCost[EventDumpCounter]) > float(Price[EventDumpCounter]):
                    if "Horse" in EventTags[EventDumpCounter]:
                        Eventes = ET.SubElement(root, "Event", type = EventTags[EventDumpCounter])
                        ET.SubElement(Eventes, "EventTime").text = str(EventTimes[EventDumpCounter])
                        ET.SubElement(Eventes, "EventName").text = str(EventName[EventDumpCounter])
                        ET.SubElement(Eventes, "EventLoc").text = str(EventLoc[EventDumpCounter])
                        ET.SubElement(Eventes, "EventSpace").text = str(EventSpace[EventDumpCounter])
                        ET.SubElement(Eventes, "EventCost").text = str(EventCost[EventDumpCounter])
                        ET.SubElement(Eventes, "EventPrice").text = str(EventPrice[EventDumpCounter])
                        ET.SubElement(Eventes, "EventParking").text = str(EventParking[EventDumpCounter])
                        ET.SubElement(Eventes, "EventDist").text = str(EventDist[EventDumpCounter])
                EventDumpCounter +=1
            except: # bad idea, you just supressed debug info
                # potential problem = since you supress the error and continue
                # processing but EventDumpCounter never advanced, you could
                # get stuck in an infinite error loop.
                print "Problem writing XML"
        tree.write("Temp.xml")
    #except:
    except WindowsError, e:
        print "Problem creating XML 2"
        #e = sys.exc_info()[0]
        print e

最新更新