我需要生成一个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填充一个实体集合,该集合会击中Server数据库中的一个视图(这是一个最无效的索引数据库)。我将这个集合分组,然后迭代,然后分组下一个级别,然后遍历这个集合,直到找到最高级别的元素为止。然后,我将数据组织到反映模式(实际上只是映射)和设置顺序recordIdentifier的对象中(我考虑过在SQL中这样做,但考虑到标识符将头元素跨越到子元素,嵌套联接或CTEs的数量将是荒谬的)。我将一个更高级别的元素(比如level2Element)和它的子元素写入输出文件。完成此级别的写作之后,我将移到父组,并使用聚合的数据及其标识符插入标头。
有没有人想过如何更好地输出这么大的XML文件?
发布于 2013-09-24 19:19:40
据我所知,您的问题并不在于有限的存储空间,即HDD。很难在内存中维护一个大型XDocument对象,即RAM。要解决这个问题,你可以忽略制造这么大的物体。对于每个recovrdIdentifier元素,您可以调用.ToString()并获得一个字符串。现在,只需将这些字符串附加到文件中即可。将声明和根标记放在这个文件中,您就完成了。
https://stackoverflow.com/questions/18989951
复制相似问题