Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
XslCompiledTransform System.OutOfMemoryException_Xslcompiledtransform - Fatal编程技术网

XslCompiledTransform System.OutOfMemoryException

XslCompiledTransform System.OutOfMemoryException,xslcompiledtransform,Xslcompiledtransform,我有使用SQL输出作为XML提取数据的代码。 挑选 Col1作为一个 Col2 AS B 等等 Colxx作为IJ 对于XML路径('MyPath')、根('MyRoot')、元素 数据作为XpathDocument保存,并传递给XslCompiledTransform以将其格式化为CSV文件,只需在每个数据项中添加逗号并将其输出到文件(TextWriter) XSL非常简单-下面显示了一个片段 <xsl:text/><xsl:value-of select="GK&

我有使用SQL输出作为XML提取数据的代码。 挑选 Col1作为一个 Col2 AS B 等等 Colxx作为IJ 对于XML路径('MyPath')、根('MyRoot')、元素

数据作为XpathDocument保存,并传递给XslCompiledTransform以将其格式化为CSV文件,只需在每个数据项中添加逗号并将其输出到文件(TextWriter)

XSL非常简单-下面显示了一个片段

<xsl:text/><xsl:value-of select="GK"/>,<xsl:text/>
<xsl:text/><xsl:value-of select="GL"/>,<xsl:text/>
<xsl:text/><xsl:value-of select="GM"/>,<xsl:text/>
<xsl:text/><xsl:value-of select="GN"/>,<xsl:text/>
<xsl:text/><xsl:value-of select="GO"/>,<xsl:text/>
<xsl:text/><xsl:value-of select="GP"/>,<xsl:text/>
<xsl:text/><xsl:value-of select="GQ"/>,<xsl:text/>
<xsl:text/><xsl:value-of select="format-number(GR,'####0.00')"/>,<xsl:text/>
<xsl:text/><xsl:value-of select="format-number(GS,'####0.00')"/>,<xsl:text/>
<xsl:text/><xsl:value-of select="format-number(GT,'####0.00')"/>,<xsl:text/>
末级

我认为这将一次一个节点读取XML文档,格式化节点并将其输出到文本写入文件。我甚至尝试添加一个“刷新”来释放资源。 然而,我仍然得到相同的结果-系统内存不足

也许我误解了什么,我没有真正读取XML并将其逐节点写入文件。或者我误解了造成记忆缺失的原因

SQL返回大约215000行。 每行大约有230列。 在另一种情况下,它返回大约128000行,系统处理正常

我开始认为我需要修改逻辑,将要传递的行数细分为两个或多个块,然后依次处理每个块,将输出数据附加到同一个文件中

如果我正在使用的代码/技术有问题,或者其他技术更合适

n、 b.数据列的名称已别名为短名称,例如AA、AB等(当然在XSL中也是如此),以减少最初检索到的数据的大小

Public Shared Function OutputXmlDocNodeByNode(ByVal XPathDoc As XPathDocument, ByVal XsltName As String, ByVal NodeSelection As String, ByVal OutputFile As TextWriter) As Boolean
    'https://docs.microsoft.com/en-us/dotnet/standard/data/xml/how-to-transform-a-node-fragment

    If XPathDoc.CreateNavigator.OuterXml.Length = 0 Then
        Return False
    Else
        ' Load the XSLCompiledTranform
        Dim embeddedResolver As New EmbeddedResourceResolver()
        Dim xslCT As XslCompiledTransform = New XslCompiledTransform()
        xslCT.Load("AAA.BBB.CCC.MyProgram." + XsltName, XsltSettings.TrustedXslt, embeddedResolver)

        ' Objects to iterate through the nodes of the XML Document and read each node
        Dim xmlNavForDoc As XPathNavigator
        Dim xmlNavSingleNode As XPathNavigator
        Dim xmlNI As XPathNodeIterator
        Dim xmlreader As XmlReader

        xmlNavForDoc = XPathDoc.CreateNavigator()

        xmlNI = xmlNavForDoc.Select(NodeSelection)

        Dim outputRecordCount As Integer = 0

        While (xmlNI.MoveNext())
            xmlNavSingleNode = xmlNI.Current

            ' Populate the reader with just the node fragment.'
            xmlreader = xmlNavSingleNode.ReadSubtree()
            xmlreader.MoveToContent()

            'Transform the node fragment and write to file
            xslCT.Transform(xmlreader, Nothing, OutputFile)

            'Flush the text writer every so often
            outputRecordCount += 1

            If outputRecordCount > 10 Then
                outputRecordCount = 0
                OutputFile.Flush()
            End If

        End While
        OutputFile.Close()
        Return True
    End If

End Function