首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超大型XML文件生成

超大型XML文件生成
EN

Stack Overflow用户
提问于 2013-09-24 19:06:01
回答 1查看 230关注 0票数 2

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

代码语言:javascript
复制
<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填充一个实体集合,该集合会击中Server数据库中的一个视图(这是一个最无效的索引数据库)。我将这个集合分组,然后迭代,然后分组下一个级别,然后遍历这个集合,直到找到最高级别的元素为止。然后,我将数据组织到反映模式(实际上只是映射)和设置顺序recordIdentifier的对象中(我考虑过在SQL中这样做,但考虑到标识符将头元素跨越到子元素,嵌套联接或CTEs的数量将是荒谬的)。我将一个更高级别的元素(比如level2Element)和它的子元素写入输出文件。完成此级别的写作之后,我将移到父组,并使用聚合的数据及其标识符插入标头。

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

EN

回答 1

Stack Overflow用户

发布于 2013-09-24 19:19:40

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18989951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档