我正在开发一个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)
目前我将gold
和audit
放在全局记忆中。 compare_func()
使用event
中的传入条目events
生成针对gold
和audit
的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()
。
gold
和audit
在任何时候都没有改变。
答案 0 :(得分:0)
问题:分析表明脚本花费大部分时间执行xpath查询。
您是否意识到每个process
都使用他自己的gold/audit
副本
使用shared memory
没有任何好处。
我认为使用xml parser
代替多个xpath queries
会更有效率。区别在于xml parser
只读了xml
一次。但是很难说我不知道你的xml
数据,也不知道是否需要比较所有或xml nodes
{。}}。