当CPU利用率已经接近100%时,多线程是否有帮助?

时间:2014-11-09 05:01:33

标签: python multithreading xml-parsing operating-system

我们有一个python程序,可读取大约120,000个XML文件,解析它们(使用ElementTree),提取标记值(fromstring().findall())等。这需要花费很长时间。我们想过使用线程并行化程序。但top显示此单个进程的CPU消耗约为100%。所以,我的问题是线程真的会有所帮助。我的直觉是,只有当剩余的CPU剩余时,线程才有用。

我的系统配置是 -

pavan8085@Xeek:/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 :我是Python新手。所以可能会有一些语言特定的技巧可以帮助提高速度。如果这是问题,我会很乐意提供更多信息。

3 个答案:

答案 0 :(得分:3)

绝对是因为这里最可能的瓶颈实际上是I / O而不是CPU。所以你在这里正在做的是按顺序处理每个文件,所以每次你等待从磁盘读取文件时,你就会遇到阻碍一切发生的瓶颈。如果您使用多个线程,则可以同时处理多个文件,而在等待I / O时,可以处理其余文件。

这是一个很好的解释,为什么I / O阻塞会导致高CPU利用率http://www.chileoffshore.com/en/interesting-articles/126-linux-wait-io-problem

仅仅因为它是100%并不意味着它在那段时间内实际上正在进行计算工作。

答案 1 :(得分:3)

关于Python和并发性以及Python和XML处理的三件事:

  1. Python的多线程功能仅限于解决IO绑定操作。有关更多说明,请查找“Global Interpreter Lock”或“GIL”。相反,当您有多个CPU时,要拆分并同时处理CPU绑定工作,请使用multiprocessing模块
  2. 当处理大型XML文件需要更快时,您不希望使用在纯Python中实现的ElementTree。 CPython附带了一个名为cElementTree的用C编写的相同API的实现。它会执行得更快。
  3. 虽然cElementTree很快,但实现elementtree API的世界标准lxml库仍然更快。安装起来相对简单,具体取决于您的操作系统。
  4. 查看https://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers,了解如何通过工作流程池分散工作。

答案 2 :(得分:1)

假设您使用标准的CPython实现,多线程不太可能在这种情况下有所帮助,因为它具有全局解释器锁并且Python中的线程无法同时运行。因此,您不能使用多个CPU核心。

XML解析实际上非常昂贵,内置解析器并不是最快的解析器。已知Lxml更快,但如果您愿意将自己的绑定编写到C或C ++库,则可以选择更快的选项。

您可能需要look here或提出自己的基准。

您需要对代码进行概要分析,但在使用Python分析工具时要小心,因为它们常常会被扩展模块混淆,如果您正在解析使用扩展模块的XML,很可能会这样做。

另外,根据XML的结构,解析XML文件通常不利于并行性。你可能会有很多共享状态。如果您处理 XML并对每个更可能可并行化的元素执行某些操作,则可以独立执行每个操作。我会在那里花费我的努力取决于你的分析显示。