2010-07-02 5 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

+0

나는 SAX를 사용하여 XML을 읽는다. import xml.dom.pulldom – Winston999

+0

여기 뭔가 기괴하게 잘못된 것이 있습니다. 가장 느린 파서조차도 그렇게 간단한 것을 파싱하는데 눈에 띄는 시간이 걸리지 않습니다. 그 25 대를 빠는 일종의 다른 네트워크 조회가 있다고 생각합니다. – bobince

답변

0

나는 ... 아주 당황 해요 25 초도에 (에서 읽고, 당신이주는 것 같은 작은 XML 파일을 구문 분석하는 것보다

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

100 마이크로 더 합리적인 것 같다 타이밍을 위해 사용하고있는 오래된 노트북!) -하지만 내 구문 분석이 당신 것보다 25 만 배 더 빠르다는 사실을 설명하는 방법!

이 ... BTW, rex.py입니다 :

import xml.etree.cElementTree as et 

def t(fn='static.xml'): 
    return et.parse(fn) 

static.xml 내가 당신의 XML 예제 (223 자) 쓴 파일입니다.

플랫폼, OS, Python 버전, 선택한 XML 파서 등은 무엇입니까? 저는 맥북 프로 랩탑, OSX 10.5.8, 2.4GHz Intel Core Duo, 667MHz DDR2 RAM을 사용하고 있습니다. 제가 말했듯이, 꽤 오래된 기계입니다! - python.org에서 Python 2.6.4를 직접 사용할 수 있습니다.

+0

안녕하세요, Alex, 하드웨어가 아닌 것 같습니다. 사실 ClntMgr에서 XML을 구문 분석 할 수 있지만 ClntMgrFact에 의해 생성 된 새 프로세스가 작업자에서는 생성되지 않습니다. 내 서버 구조를 변경하고 싶지 않은 이유는 Active Python 2.4에서 제대로 작동한다는 것입니다. 내 플랫폼 : Windows XP, Py2.6.5, SAX 파서, CPU 2.2G, 2.19G, RAM 2G – Winston999

+0

SAX를 사용하면 250 마이크로 초의 놀라운 속도를 경험할 수 있습니다. 봄. 당신은 무언가를해야 ** ** 처리기 또는 그 안에서 느리게 ** 천천히. 서버를 전혀 변경하지 않고 XML 파싱의 특정 작업을 위해 단순히 'cElementTree'로 전환하지 않고 단순성과 속도를 즐기십시오.아마도 작업자 스레드가 잠금, 대기 및 지연의 일종의 나쁜 상호 작용에 의해 굶어 죽었을 수도 있습니다. –

+0

cElementTree가 도움이됩니다. 샘플 XML을 읽을 때 5 배 더 빠릅니다. 하지만 내 시스템은 700k의 파일을 읽어야합니다. 나는 프로세스 문제가 될 가능성이 더 높다고 생각한다. Py2.4.4로 서버를 테스트했습니다. 그것은 잘 작동합니다. – Winston999