在Python 3中高效的多进程查询XML数据

时间:2017-06-14 16:55:13

标签: python python-3.x xpath multiprocessing lxml

我正在开发一个Python 3测试脚本,用于比较两个XML文件(磁盘上500多MB)中的数据。该脚本使用LXML将文件读入etree对象,然后对这两个文件执行多对xpath查询,比较查询返回的值。

分析表明脚本花费大部分时间执行xpath查询。

我一直在尝试使用多处理来跨多个核心分配工作。问题是让子流程访问etree对象:

gold = etree.parse(gold_file.as_posix())
audit = etree.parse(audit_file.as_posix())

我对名为events的列表中的两个文件进行了比较。此列表的每个元素都转换为xpath查询,以便按compare_func()运行在两个etree对象上,如下所示:

events = ["4", "8", "15", "16", "23", "42"]
pool = multiprocessing.Pool()
res = pool.map(compare_func, events)

目前我将goldaudit放在全局记忆中。 compare_func()使用event中的传入条目events生成针对goldaudit的xpath查询,以检索数据并执行一些比较:

def compare_func(event):
    global gold
    global audit
    query = ... transformation of event ...
    g_res = gold.xpath(query)
    a_res = audit.xapth(query)
    ... comparisons between g_res and a_res ...

这有效,但我想知道是否有办法将etree对象放在共享内存中,并使用compare_func()而不是pool.starmap()将引用传递给pool.map()

goldaudit在任何时候都没有改变。

1 个答案:

答案 0 :(得分:0)

  

问题:分析表明脚本花费大部分时间执行xpath查询。

您是否意识到每个process都使用他自己的gold/audit副本 使用shared memory没有任何好处。

我认为使用xml parser代替多个xpath queries会更有效率。区别在于xml parser只读了xml 一次。但是很难说我不知道​​你的xml数据,也不知道是否需要比较所有或xml nodes {。}}。