我们有一个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新手。所以可能会有一些语言特定的技巧可以帮助提高速度。如果这是问题,我会很乐意提供更多信息。
答案 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处理的三件事:
multiprocessing
模块ElementTree
。 CPython附带了一个名为cElementTree
的用C编写的相同API的实现。它会执行得更快。lxml
库仍然更快。安装起来相对简单,具体取决于您的操作系统。查看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并对每个更可能可并行化的元素执行某些操作,则可以独立执行每个操作。我会在那里花费我的努力取决于你的分析显示。