生成非常大的XML文件

时间:2013-09-24 19:06:01

标签: c# xml

我需要生成XML文件。这在C#中很容易。问题(除了慢速数据库查询[单独的问题])是输出文件很容易达到2GB。最重要的是,输出XML的格式不能在SQL中轻松完成。每个父元素聚合其子元素中的元素维护跨越文件的顺序唯一标识符。 例如:

<level1Element>
    <recordIdentifier>1</recordIdentifier>
    <aggregateOfLevel2Children>11</aggregateOfL2Children>
    <level2Children>
        <level2Element>
        <recordIdentifier>2</recordIdentifier>
            <aggregateOfLevel3Children>92929</aggregateOfLevel3Children>
            <level3Children>
                <level3Element>
                    <recordIdentifier>3</recordIdentifier>
                    <level3Data>a</level3Data>
                </level3Element>
                <level3Element>
                    <recordIdentifier>4</recordIdentifier>
                    <level3Data>b</level3Data>
                </level3Element>
            </level3Children>
        </level2Element>
        <level2Element>
        <recordIdentifier>5</recordIdentifier>
            <aggregateOfLevel3Children>92929</aggregateOfLevel3Children>
            <level3Children>
                <level3Element>
                    <recordIdentifier>6</recordIdentifier>
                    <level3Data>h</level3Data>
                </level3Element>
                <level3Element>
                    <recordIdentifier>7</recordIdentifier>
                    <level3Data>e</level3Data>
                </level3Element>
            </level3Children>
        </level2Element>
    </level2Children>
</level1Element>

使用的架构实际上升了五个级别。为了简洁起见,我只包括3.我不控制这个模式,也不能请求对它进行更改。

将对象中的所有数据聚合并基于此模式序列化为XML,这是一个简单,甚至是微不足道的事情。但是在处理如此大量的数据时,使用此策略时会出现内存不足的情况。

对我有用的策略是这样的:我通过一个ObjectContext填充实体集合,该对象访问SQL Server数据库中的一个视图(一个最无效的索引数据库)。我正在对这个集合进行分组然后迭代,然后对下一个级别进行分组,然后迭代直到我到达最高级别的元素。然后我将数据组织到反映模式的对象(实际上只是映射)和设置顺序recordIdentifier(我考虑在SQL中这样做,但考虑到标识符,嵌套连接或CTE的数量将是荒谬的将标题元素跨越到子元素中。我将更高级别的元素(比如level2Element)及其子元素写入输出文件。一旦我完成了这个级别的写作,我将移动到父组并插入带有聚合数据及其标识符的标题。

有没有人想过更好地输出如此大的XML文件?

1 个答案:

答案 0 :(得分:1)

据我了解您的问题,您的问题不在于有限的存储空间,即HDD。您很难在内存中保留一个大XDocument个对象,RAM。要处理这个问题,你可以忽略制造如此庞大的物体。对于每个recovrdIdentifier元素,您可以调用.ToString()并获取字符串。现在,只需将此字符串附加到文件即可。将声明和根标记放在此文件中,您就完成了。