Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml Python2-sax解析器,大文件的最佳速度和性能?_Xml_Sax_Python 2.x_Suds - Fatal编程技术网

Xml Python2-sax解析器,大文件的最佳速度和性能?

Xml Python2-sax解析器,大文件的最佳速度和性能?,xml,sax,python-2.x,suds,Xml,Sax,Python 2.x,Suds,因此,我一直在使用肥皂水来消费Web服务,这是非常有益的 遇到性能问题时,对于一些cpu可能会出现严重峰值的数据,需要60多秒才能完成请求,由gunicorn、suds to webservice等提供服务 通过line_profiler、objgraph、memory_profiler等工具,我发现罪魁祸首是解析一个9.2mb xml文件需要13秒,这是Web服务的响应 那不正常吧?只有9.2mb,我看到99%的时间都花在解析上,而解析是通过“from xml.sax import make_

因此,我一直在使用肥皂水来消费Web服务,这是非常有益的

遇到性能问题时,对于一些cpu可能会出现严重峰值的数据,需要60多秒才能完成请求,由gunicorn、suds to webservice等提供服务

通过line_profiler、objgraph、memory_profiler等工具,我发现罪魁祸首是解析一个9.2mb xml文件需要13秒,这是Web服务的响应

那不正常吧?只有9.2mb,我看到99%的时间都花在解析上,而解析是通过“from xml.sax import make_parser”完成的,这意味着标准python

有没有更快的xml解析器来解析大文件

我将研究XML中的具体结构,但到目前为止,我知道它的“UmResponse”包含大约7000个“Document”元素,每个元素包含10-20行元素

编辑:进一步调查,我发现13秒中有一半是在suds/sax/中的suds处理程序中花费的。。。当然,hm可能是suds问题,而不是python库

EDIT2:suds unmarshaller使用了处理这个的大部分时间,大约50秒,使用sax解析也很慢,使用xml.minidom的PySimpleSAP大约需要13秒和大量内存。然而,lxml.etree低于2s,objectify也非常快,足够快,可以用它来代替ElementTree(对于这个特定的xml,它比celementree快,对于一个xml,它比celementree快0.5s,对于另一个xml,它比celementree快0.17s)


解决方案:Suds允许参数retxml为true,在不解析和解组的情况下返回XML,从那里我可以用lxml更快地完成这项工作。

使用sax解析Suds需要时间,更重要的是Suds src bindings/binding中的解组方法使用了大量的类umx/Typed

解决方案,绕过所有这些: 将retxml=True传递给客户端,这样suds就不会进行解析和解组,这是suds的一个很棒的选项!我发现lxml是最快的,甚至比cElementTree还要快

from lxml import objectify
from lxml.etree import XMLParser
现在的另一个问题是xml有巨大的txt节点,超过10mb,因此lxml将退出,XMLParser需要使用标志jugge_tree=True来吞咽和处理大型数据文件。这样设置,Set\u元素\u类\u查找是非常有好处的,如果没有它,您就不会真正得到ObjectFedElement

parser = XMLParser(remove_blank_text=True, huge_tree=True)
parser.set_element_class_lookup(objectify.ObjectifyElementClassLookup())
objectify.set_default_parser(parser)
obj = objectify.fromstring(ret_xml)
# iter here and return Body or Body[0] or whatever you need
#so all code which worked with suds unmarshaller works with objectified aswell 
然后,代码的其余部分在suds解组时按属性查找元素,工作正常(就在返回soap信封主体之后),无需处理xpath或iteraparse xml元素


objectify只需1-2秒就可以完成这项工作,相比之下,SUD解组只需50-60秒。

您可以尝试使用Python libxml2绑定或lxml。它可能会稍微快一点,但我不认为它会有很大的不同。您已经说过,完成请求需要60多秒,而解析文件只需要13秒。假设你奇迹般地将解析速度提高到0秒,那么你仍然需要50秒来解析文件。@CadentOrange是这样的,进一步看,13s是用于使用sax解析器或minidom解析器进行解析的,它们的速度大致相同,但suds unmarshaller方法使用了50秒。啊。因此,由于sax解析器及其ContentHandler,suds需要花费大量时间,因此构建某种类型的SUDSDOM所需的时间比MinidDOM所需的时间要多。最快的是ElementTree和objectify。这是一个非常好的发现。我使用肥皂水,如果我有幸需要解析一个大的XML响应,你的帖子会很有帮助;将其作为答案发布,而不是编辑你的问题。很高兴有人觉得这很有用,否则肥皂水就太棒了。