2

我需要生成一个 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 中这样做,但考虑到标识符跨越标题元素到子元素)。我写了一个更高级别的元素(比如level2Element) 及其子级到输出文件。在此级别完成编写后,我将移动到父组并插入带有聚合数据及其标识符的标题。

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

4

1 回答 1

1

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

于 2013-09-24T19:19:40.730 回答