C# 非常大的XML文件生成
我需要生成一个XML文件。这在C#中很简单。问题(除了缓慢的数据库查询[separate problem])是输出文件很容易达到2GB。最重要的是,输出XML的格式不能用SQL轻松完成。每个父元素聚合其子元素中的元素,并维护跨文件的顺序唯一标识符。 例如: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个。我不控制此架构,也不能请求对其进行更改 将所有这些数据聚合到对象中并基于此模式序列化为
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>