2014-11-09 2 views
1

우리는 약 120,000 개의 XML 파일을 읽고, (ElementTree을 사용하여) 구문 분석하고, 태그 값 (fromstring().findall()) 등을 추출하는 Python 프로그램을 가지고 있습니다. 이것은 시간이 오래 걸리고 있습니다. 스레드를 사용하여 프로그램을 병렬 처리하는 방법을 생각했습니다. 그러나 top은이 단일 프로세스의 CPU 소비가 약 100 %임을 보여줍니다. 그래서, 제 질문은 정말 도움 스레딩 것입니다. 내 직관은 여분의 CPU가 남아있을 때만 스레딩이 도움이된다는 것입니다.CPU 사용률이 이미 100 %에 가까워지면 멀티 스레딩이 도움이됩니까?

내 시스템의 설정입니다 -

[email protected]:/media/pavan8085/Projects/Pavan/CompBio$ lscpu 
Architecture:   x86_64 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    4 
On-line CPU(s) list: 0-3 
Thread(s) per core: 2 
Core(s) per socket: 2 
Socket(s):    1 
NUMA node(s):   1 
Vendor ID:    GenuineIntel 
CPU family:   6 
Model:     69 
Stepping:    1 
CPU MHz:    782.000 
BogoMIPS:    3392.44 
Virtualization:  VT-x 
L1d cache:    32K 
L1i cache:    32K 
L2 cache:    256K 
L3 cache:    3072K 
NUMA node0 CPU(s):  0-3 

PS : 나는 파이썬에 완전히 새로운 오전. 따라서 속도를 향상시키는 데 도움이되는 언어 별 트릭이있을 수 있습니다. 그게 문제라면 더 많은 정보를 제공하게되어 기쁩니다.

+2

[어떤 프로파일 링] (https://docs.python.org/3/library/profile.html)을 보면 시간이 어디서 시작되는지 알 수 있습니다. –

+0

또한 너무 많은 메모리를 사용하지 않도록하십시오. 당신이 fromstring을 사용하고 있다는 사실은 한 번에 적어도 하나의 파일을 전체적으로 메모리로 읽어 들이고 있음을 의미합니다. 모두 읽는다면 시간을 모두 바꿀 수 있습니다. – abarnert

답변

3

여기서 병목 현상이 발생할 가능성이 가장 큰 이유는 실제로 CPU가 아닌 입출력입니다. 따라서 여기서 수행하는 작업은 각 파일을 순차적으로 처리하는 것이므로 디스크에서 파일을 읽을 때까지 기다릴 때마다 발생하는 모든 것을 차단하는 병목 현상이 있습니다. 여러 스레드를 사용하는 경우 여러 파일을 동시에 처리 할 수 ​​있으며 I/O를 기다리는 동안 나머지 파일을 처리 할 수 ​​있습니다.

이것은 실제로 그 시간 동안 계산 작업을하고있어 의미하지 않는다 그냥 100 %이기 때문에 I/O를 차단이 높은 CPU 사용률을 http://www.chileoffshore.com/en/interesting-articles/126-linux-wait-io-problem

발생할 수 있습니다 이유에 좋은 설명입니다. 바로 파이썬과 동시성, 그리고 파이썬과 XML 처리에 대한 박쥐

3

세 가지 :

  1. 파이썬의 멀티 스레딩 기능은 IO-바인딩 작업 주위에 작업로 제한됩니다. 자세한 설명은 "Global Interpreter Lock"또는 "GIL"을 찾아보십시오. 대신 CPU를 여러 개 가지고있을 때 CPU 바인딩 작업을 분할하여 동시에 수행하려면 multiprocessing 모듈을 사용하십시오.
  2. 큰 XML 파일을 처리해야 할 때 순수 Python으로 구현 된 ElementTree을 사용하고 싶지는 않습니다. . CPython은 cElementTree이라는 이름으로 C로 작성된 API와 동일한 API를 구현합니다. 훨씬 더 빨리 실행됩니다.
  3. cElementTree가 빠르지 만 elementtree API도 구현하는 세계 표준 lxml 라이브러리가 더 빠릅니다. 운영 체제에 따라 설치하는 것이 상대적으로 간단합니다.

https://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers을 보아 작업자 프로세스 풀 전체에 걸쳐 작업을 분산시킬 수 있습니다.

+1

포인트 # 2는 파이썬 2.x에서만 유효합니다. 3.x에서는 ElementTree가 자동으로 C 액셀러레이터를 사용합니다. – abarnert

+0

또한, lxml은 보통 stdlib의 C 구현보다 빠르지 만 항상 그렇다고 볼 수는 없으므로 테스트와 테스트 모두 시도해 볼 가치가 있습니다. – abarnert

1

글로벌 인터프리터 잠금이 있고 파이썬의 스레드를 동시에 실행할 수 없기 때문에 표준 CPython 구현을 사용한다고 가정하면이 상황에서 멀티 스레드가 도움이되지 않을 수 있습니다. 따라서 하나 이상의 CPU 코어를 활용할 수 없습니다.

XML 파싱은 실제로 상당히 비싸고 기본 제공 파서는 사용할 수있는 파서가 가장 빠릅니다. Lxml은 더 빠르다고 알려져 있지만 C 또는 C++ 라이브러리에 직접 바인딩을 작성하려는 경우 더 빠른 옵션이 있습니다.

look here 또는 자신의 벤치 마크를 제안 할 수 있습니다.

파이썬 프로파일 링 도구를 사용할 때는 확장 모듈을 사용하여 XML을 구문 분석하는 경우와 같이 종종 확장 모듈에서 혼란 스러울 수 있으므로 코드를 프로파일 링해야하지만 파이썬 프로파일 링 도구를 사용할 때는주의해야합니다.

XML 구조에 따라 XML 파일 구문 분석은 일반적으로 병렬 처리에 도움이되지 않습니다. 당신은 아마도 많은 공유 상태를 가질 것입니다. 처리하고있는 경우 XML 및 각 작업을 독립적으로 수행 할 수 있으므로 병렬 처리 가능성이 훨씬 높은 각 요소에 대해 일부 작업을 수행하면됩니다. 귀하의 프로파일 링이 보여주는 것에 따라 나는 거기에 노력을 기울일 것입니다.

관련 문제