C# 非常大的XML文件生成

C# 非常大的XML文件生成,c#,xml,C#,Xml,我需要生成一个XML文件。这在C#中很简单。问题(除了缓慢的数据库查询[separate problem])是输出文件很容易达到2GB。最重要的是,输出XML的格式不能用SQL轻松完成。每个父元素聚合其子元素中的元素,并维护跨文件的顺序唯一标识符。 例如: 1. 11 2. 92929 3. A. 4. B 5. 92929 6. H 7. E 使用中的模式实际上上升了五个级别。为了简洁起见,我只包括3个。我不控制此架构,也不能请求对其进行更改 将所有这些数据聚合到对象中并基于此模式序列化为

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


1.
11
2.
92929
3.
A.
4.
B
5.
92929
6.
H
7.
E
使用中的模式实际上上升了五个级别。为了简洁起见,我只包括3个。我不控制此架构,也不能请求对其进行更改

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

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


有人对输出如此大的XML文件的更好方法有什么想法吗?

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

您想知道如何输出它吗?如果您在一台相当现代化的计算机上使用,则文件大小应仅受可用硬盘空间的限制。请展示您的尝试。将XML输出写入文件有许多不同的方法。May可以帮助您。您如何将数据从数据库中提取到XML中?您是否使用原始XML auto和ExecuteXmlReader?如果我在SQL查询中进行聚合,您的实现需要一些细节
XMLTextWriter
可能会起作用。编写器允许我在遍历实体时增加标识符,而无需将它们全部加载到内存中。由于数据库的索引很差,我不适合这样做。请随意发布
XMLTextWriter
作为答案。谢谢大家的意见。
<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>