【问题标题】:How can I speed up loading of XML documents from disk?如何加快从磁盘加载 XML 文档的速度?
【发布时间】:2020-09-02 18:11:42
【问题描述】:

我正在尝试加快 VB6 XML 解析器的速度。要解析的 XML 文件存储在我的本地硬盘上。根据我的分析结果,下面的If xDOC.Load(objFile.Path) Then 语句需要很长时间。在处理一小批 100 个 XML 文件期间,该语句总共花费了 34.5 秒。示例 XML 文件是 here。是否可以改进此代码以加快 XML 文件的加载速度,或者加载速度是否受 XML 文件本身的性质限制?

Option Explicit

Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object

Dim xDOC As MSXML2.DOMDocument

Dim xPE As MSXML2.IXMLDOMParseError

Sub Main()

Set xDOC = New DOMDocument

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objFSO.GetFolder("C:\My XML File Folder")

For Each objFile In objFolder.Files
    Set xDOC = New DOMDocument
    xDOC.async = False

    If xDOC.Load(objFile.Path) Then
        ' process the file
    Else
        ' XML file failed to load; log error and continue with next file
    End If

   Set xDOC = Nothing

Next objFile

Set objFolder = Nothing

End Sub

【问题讨论】:

    标签: xml performance dom xml-parsing vb6


    【解决方案1】:

    在 windows 中使用以下命令运行它

    cscript.exe testperf.js testfile.xml 1000
    

    这是 testperf.js

    var aArguments = WScript.Arguments;
    var xmlDoc;
    var xslDoc;
    
    function loadXMLFile( strFileName ) {
        var xml = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
        xml.setProperty("SelectionNamespaces", "xmlns:ms='urn:schemas-microsoft-com:xslt'");
        xml.validateOnParse = false;
        xml.resolveExternals = false;
        xml.preserveWhiteSpace = false;
        if( !xml.load( strFileName ) ) {
            var strError = "";
            var facility = xml.parseError.errorCode>>16 & 0x1FFF;
            var code = xml.parseError.errorCode & 0xFFFF;
            strError = 'Error loading: ' + strFileName + '\r\n';
            strError += xml.parseError.reason;
            strError += "Facility: " + facility + " Code: " + code + "\r\n";
            strError += xml.parseError.srcText + "\r\n";
            strError += xml.parseError.url + "\r\n";
            strError += "Line: " + xml.parseError.line +  " Postion: " + xml.parseError.linepos + "\r\n";
            throw new Error( xml.parseError.errorCode, strError );
        }
        return xml;
    }
    
    try {
        if( aArguments.length < 2 ) {
            WScript.Echo( "Usage: testperf file.xml loadcount" );
            WScript.Quit( 1 );
        }
        var strStatus = 'Loading XML';
    
        var dtStart = new Date().valueOf();
        var nLoop = parseInt( aArguments(1) );
        for( i = 0; i < nLoop; i++ ) {
            xmlDoc = loadXMLFile( aArguments(0) );
        }
        var dtStop = new Date().valueOf();
        WScript.Echo( nLoop + " XML loads took " + parseFloat( (dtStop - dtStart) / 1000 ).toFixed( 2 ) + " seconds.");
    
    }
    catch( e ) {
        WScript.Echo( 'Error in file:' + aArguments(1) + '\n' + e.number + " " + e.description );
        WScript.Quit( 1 );
    }
    

    【讨论】:

      【解决方案2】:

      您的 XML 很好,实际上它非常小,并且加载速度非常快,并且具有正确的文档设置。

      我确实注意到了 DTD,每次下载文件时都会从 http://patents.ic.gc.ca/cipo/dtd/ca-patent-document-v2-0.dtd 重新下载。此外,DTD 本身嵌入了其他 DTD 文件,因此您可能也会下载它们。

      默认情况下,MSXML XML 会做很多额外的事情,但是如果您的 XML 被认为是“好”的,那么加载它的最快方法是在调用 Load() 之前将以下值设置为 false。这样,您只需要验证 XML 格式是否正确。

      var doc = new ActiveXObject("MSXML2.DOMDocument");
      doc.validateOnParse = false;  // don't validate
      doc.resolveExternals = false; // don't even download external files (DTDs...)
      doc.preserveWhiteSpace = false; // don't try to preserve formatting.
      doc.load("somexml.xml");
      

      希望对您有所帮助,您可以通过 VB6 进行翻译

      【讨论】:

      • 谢谢。这让我的速度立即提高了 3.3 倍。它仍然很慢,但我会采取任何改进措施(我正在粉碎数百万个文件)。 [我花了很多时间在 VB 优化技巧、数据库索引调优、查询执行计划监控、存储过程代码重写、向数据库表中添加索引哈希列等等。这些都没有产生哪怕是最微小的差异。加载单个 XML 文件所花费的时间淹没了一切。我的服务器正在闲逛,在等待下一个文件加载到我的客户端应用程序时无事可做。]
      • 在我的团队中,我们做了很多类似的工作,XML 粉碎,将 XML 导入 MS-SQL 数据库。尽量减少访问数据库的次数(将 XML 文件分组在一起,在存储过程中解析 XML,分组提交),如果您有兴趣进一步讨论该项目,欢迎联系。
      • 再次感谢威廉。我的评论“加载单个 XML 文件所花费的时间淹没了一切”在我正在做的整体上下文中是否有意义?我已经尽可能地减少数据库选择/更新/删除。我曾认为数据库索引重建(由于数百万行表上的插入/删除)导致了我的性能问题,但与加载单个 XML 文件所需的时间相比,它们是微不足道的。我应该补充一点,我的本地硬盘(存储 XML 文件)是 SSD。
      • 在我之前的评论中,“索引重建”应该是“索引更新”。
      • XML 加载是缓慢的部分听起来有点不寻常,尤其是对于这么小的 XML 文件。在您最初的帖子中,您指出在 34 秒内加载了 100 个 XML 文件,我猜大约是 10 秒,提高了 3 倍。您要加载多少个文件?请注意对代码的每个部分进行计时(例如,消除所有数据库操作),以识别最慢的部分。我猜你已经这样做了?
      猜你喜欢
      • 1970-01-01
      • 2016-09-06
      • 2013-01-01
      • 2020-02-06
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多