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