PowerShell在读取大型(50 MB)XML文档时抛出System.OutOfMemoryException

时间:2014-01-21 16:57:24

标签: xml powershell memory-management large-files

我们正在运行以下脚本:

[xml]$products = Get-Content C:\fso\products.xml

并收到以下错误:

  

的System.OutOfMemoryException

我们假设这是因为XML文件很庞大。该解决方案可能涉及一次读取一行XML。 我们如何处理此文件?例如,我们如何计算元素的数量?或者,我们如何将元素名称打印到控制台窗口?

我们目前正在查看此链接:

http://blogs.technet.com/b/stephap/archive/2009/05/27/choking-on-very-large-xml-files.aspx

XML结构如下:

<?xml version="1.0" encoding="UTF-8"?>
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="Products.xsd" generated="2014-01-21T08:21:41">
        <Products>
            <upc>0000000000001</upc>
            <description>BASICS $1.00</description>
            <cost>0.6</cost>
            <normal_price>1</normal_price>
            <pricemethod>0</pricemethod>
            <target_margin>0</target_margin>
            <department>34</department>
            <pack>1</pack>
            <tax>3</tax>
            <foodstamp>0</foodstamp>
            <scale>0</scale>
            <dsd>0</dsd>
            <modified>2014-01-04T10:23:55</modified>
            <cost_modified>2012-11-11T11:20:58</cost_modified>
            <active>1</active>
            <advertised>0</advertised>
            <whomodified>170</whomodified>
            <longdescription>TEAR ISSUE</longdescription>
            <seconddescription>ROLL START</seconddescription>
            <discount>1</discount>
            <wicable>0</wicable>
            <validage>0</validage>
            <deleted>0</deleted>
            <attributes>2056</attributes>
            <Created>2005-02-16T09:53:00</Created>
            <CreatedBy>1</CreatedBy>
            <Points>0</Points>
        </Products>
        <Products>
            <upc>0000000000357</upc>
            <description>CHARMIN BATHROOM TISSUE</description>
            <cost>5.81</cost>
            <normal_price>7.99</normal_price>
            <pricemethod>0</pricemethod>
            <target_margin>0</target_margin>
            <department>4</department>
            <pack>1</pack>
            <size>OVERLIMIT</size>
            <tax>2</tax>
            <foodstamp>0</foodstamp>
            <scale>0</scale>
            <dsd>0</dsd>
            <modified>2010-06-30T23:55:00</modified>
            <active>0</active>
            <advertised>0</advertised>
            <whomodified>30</whomodified>
            <longdescription>CHARMIN BATHROOM TISSUE</longdescription>
            <discount>1</discount>
            <wicable>0</wicable>
            <validage>0</validage>
            <deleted>0</deleted>
            <attributes>2048</attributes>
            <Created>2005-02-16T09:53:00</Created>
            <CreatedBy>1</CreatedBy>
            <Points>0</Points>
        </Products>

2 个答案:

答案 0 :(得分:4)

使用XPath查询此类文档可能更好。 XPath通常可以在流模式下工作,不需要将整个文档加载到DOM树中。

请参阅Select-Xml

以下内容将计算XML文件中的所有元素:

Select-Xml -Path C:\fso\products.xml -Xpath "count(//*)"

通过这种方式,您可以获取您所使用的XML的小片段或对其进行计算。

请参阅:http://technet.microsoft.com/en-us/library/hh849968.aspx

答案 1 :(得分:1)

对于大小合适的文件,一次一行的速度会非常慢。

您可以使用Get-Content -Readcount一次处理大量的行(-ReadCount 1000将为您提供每行1000行的数组)。