2010-07-02 107 views
0

我想将我的系统从Active Python 2.4迁移到Python 2.6.5。但是我在解析XML文件时遇到了一些问题。 I/O非常慢。Python2.6 XML阅读

我的示例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> 

我的日志显示这个XML解析了25秒。

我的系统是结构如下

出版商SUBR用于重定向请求到不同模块

ClntMgrFact附接到PubSubr和收听预先定义给端口。它将产生一个从客户端登录的新过程。

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

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

任何人都可以在不改变系统结构的情况下提供帮助吗?提前致谢。

+0

你如何阅读XML文件?你使用lxml吗?它很快。 – nosklo 2010-07-02 04:19:49

+0

我正在使用SAX来读取XML。 import xml.dom.pulldom – Winston999 2010-07-02 05:08:59

+0

这里有些奇怪的错误。即使最慢的解析器也不需要花费大量的时间来解析这么简单的事情。我认为你有一些其他的网络查找吮吸这些25岁。 – bobince 2010-07-02 09:04:19

回答

0

很困惑 ...:

$ py26 -mtimeit -s'import rex' 'rex.t()' 
10000 loops, best of 3: 103 usec per loop 

100微秒似乎更合理的超过25秒的读取和分析,比如你给一个小的XML文件(甚至在我正在使用旧笔记本电脑进行计时!) - 但是,如何解释我的解析速度比你快25万倍?

这是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获得Python 2.6.4。

+0

嗨,亚历克斯, 我不认为是硬件。事实上,我能够在我的ClntMgr中解析XML,这是ClntMgrFact产生的新进程,但不是在worker中。 我不想改变我的服务器结构的原因是,它在Active Python 2.4上正常工作。 我的平台:Windows XP,Py2.6.5,SAX解析器,CPU 2.2G,2.19G,RAM 2G – Winston999 2010-07-02 05:07:45

+0

使用SAX给我250微秒 - 令人惊叹的2.5倍放缓,但仍然比您快5个数量级看到。你必须在处理程序或附近做一些非常缓慢的事情。根本不需要改变你的server _structure_,为什么不简单地切换到'cElementTree'来完成XML解析的特定任务,并且享受它的简单性和速度(或者至少看看会发生什么?也许那个工作者线程由于锁,等待和延迟的不良相互作用而饿死)。 – 2010-07-02 15:06:46

+0

cElementTree有帮助,当我读取示例XML时,速度提高了5倍。但我的系统需要读取700k的文件。我认为更可能是过程问题。我用Py2.4.4测试了我的服务器。它工作正常。 – Winston999 2010-07-05 01:53:37