Python2.6xml读取

Python2.6xml读取,python,xml,Python,Xml,我想将我的系统从活动的Python 2.4迁移到Python 2.6.5。但是,我在解析XML文件时遇到了一些问题。I/O非常慢 我的示例xml文件 <config><dicts><dictName>EnvDict</dictName><dictElems><key>AppServerIP</key> <value>localhost</value><key>DBServer

我想将我的系统从活动的Python 2.4迁移到Python 2.6.5。但是,我在解析XML文件时遇到了一些问题。I/O非常慢

我的示例xml文件

<config><dicts><dictName>EnvDict</dictName><dictElems><key>AppServerIP</key>  <value>localhost</value><key>DBServerIP</key>   <value>localhost</value><key>DBServerName</key> <value>DB1</value></dictElems></dicts></config>
envdictpappserverip localhostDBServerIP localhostDBServerName DB1
我的日志显示这个xml解析花了25秒

我的系统结构如下

Publisher-Subr用于将请求重定向到不同的模块

ClntMgrFact连接到PubSubr并侦听预定义端口。它将产生一个从客户端登录的新进程

ClntMgr(进程)由ClntMgrFact生成,并附加到PubSubr。 ClntMgr将生成一个ClntWorker(线程)来处理工作流

ClntWorker需要从本地读取一些静态XML文件。但是解析速度非常慢。我的XML文件大约是500-700k

有谁能在不改变系统结构的情况下对此提供帮助?提前谢谢。

我很困惑……:

$ py26 -mtimeit -s'import rex' 'rex.t()'
10000 loops, best of 3: 103 usec per loop
100微秒似乎比25秒读入和解析这么小的XML文件更合理(即使是在我用来计时的旧笔记本电脑上!)——但如何解释我的解析速度比你的快250000倍

这是rex.py,顺便说一句:

import xml.etree.cElementTree as et

def t(fn='static.xml'):
  return et.parse(fn)
static.xml
是我编写xml示例的文件(223个字符)


那么您的平台、操作系统、Python版本、选择的XML解析器等是什么呢。。。?我用的是macbook pro笔记本电脑,OSX 10.5.8,2.4 GHz Intel Core Duo,667 MHz DDR2 RAM——正如我所说,这确实是一台非常旧的机器直接从Python.org下载Python2.6.4。

如何读取xml文件?您正在使用lxml吗?它很快。我正在使用SAX读取XML。导入xml.dom.pulldom这里有些奇怪的错误。即使是最慢的解析器也不会花费大量的时间来解析如此简单的东西。我想你有一些其他的网络查找功能在吸走那些25。嗨,亚历克斯,我不认为是硬件。事实上,我能够在我的ClntMgr中解析XML,新进程是由ClntMgrFact生成的,但不能在worker中。我不想更改服务器结构的原因是它在活动的Python 2.4上运行良好。我的平台:Windows XP,Py2.6.5,SAX解析器,CPU 2.2G,2.19G,RAM 2G使用SAX给我250微秒——惊人的2.5倍的减速,但仍然比你看到的快5个数量级。你一定是在处理程序中做了一些非常慢的事情。在根本不改变服务器结构的情况下,为什么不简单地切换到
cElementTree
来完成XML解析的特定任务,并享受它的简单性和速度(或者至少看看接下来会发生什么?也许工作线程正因锁、等待和延迟的糟糕相互作用而变得饥饿)。cElementTree有助于,当我阅读示例XML时,速度快了5倍。但我的系统需要读取700k的文件。我认为更可能是流程问题。我用Py2.4.4测试了我的服务器。它工作得很好。@Winston,正如我所说的,我只是不能用2.6.4重现你的问题——我没有任何假设来解释为什么你的代码(我从未见过)在你的测试文件上慢了那么多(我也从未见过),并且,由于完全无法重现你观察到的慢,因此我没有任何帮助。谢谢Alex,我的问题解决了。事实证明,导致速度缓慢的不是XML。它是我的pubsubr和新生成的进程之间的TCP/IP连接。我只是在每次拉动后添加一个“time.sleep(0.01)”。谢谢你把我引向正确的方向