使用lxml.etree.iterparse和多处理的PyPy3.6性能

时间:2019-02-21 12:08:33

标签: python multiprocessing lxml pypy iterparse

我正在使用lxml.etree.iterparse创建一个xml解析器以用于轻载内存使用,因为它会处理相当大的文件,例如〜900-3000 MB。其主要目的是使用一组过滤器检查所有标签并保存检查结果。现在的支票数量大约是50,但是会增长到150〜200。 为了加快整个过程的速度,我将其分为10个具有多处理能力的过程(所有检查都是独立的,因此可以按任何顺序运行)。 使用本机CPython实现的首次测试在16 MB的xml文件上显示了以下结果:

  1. 〜5秒10个子流程。
  2. 〜13秒如果脚本在一个进程中运行,并且所有50个检查在每个标记上都依次运行。

然后,我决定尝试PyPy以加快速度。因为所有过滤器都是用纯Python编写的,并且在其中使用etree._Element,所以我认为它将提高工作速度。这样的大型xml文件可能有数百万行,并且每个文件必须检查50-200次。不幸的是 整个过程变得越来越慢。 对于相同的文件,结果是:

  1. 〜13秒10个子流程。
  2. 〜18秒。

我要处理的文件越来越大,PyPy和CPython之间的差距越来越大。 对于使用多处理的160 MB xml文件,CPython会显示约55秒。约267秒。与PyPy。此外,PyPy在运行该进程时会占用更多内存。

是因为etree的C代码的PyPy调用具有如此高的时间成本吗?以及为什么它在解析时会占用更多的内存?还是可能有其他原因?

0 个答案:

没有答案