【问题标题】:C# - Loading XML file in partsC# - 部分加载 XML 文件
【发布时间】:2013-08-26 08:44:12
【问题描述】:

我的任务是加载新的数据集(以 XML 文件编写),然后将其与“旧”集(也在 XML 中)进行比较。所有更改都写入另一个文件。

我的程序将新旧文件加载到两个数据集中,然后逐行比较新集中的主键和旧集中的主键。当我找到相应的行时,我检查所有字段,如果与旧的有差异,我将其写入第三组,然后将其写入文件。

我现在使用:

    newDS.ReadXml("data.xml");
    oldDS.ReadXml("old.xml");

然后我只找到具有相应主键的行并比较其他字段。它对小文件非常有效。

问题是我的文件可能有大约 4GB。如果我的新旧数据都那么大,那么将 8GB 的​​数据加载到内存是很成问题的。

我想分部分加载我的数据,但要比较我需要整个旧数据(或者如何从 XML 文件中获取具有相应主键的特定行?)。

另一个问题是我不知道 XML 文件的结构。由用户定义。

处理如此大的文件的最佳方法是什么?我考虑过使用 LINQ to XML,但我不知道它是否有可以帮助解决我的问题的选项。也许离开 XML 并使用不同的东西会更好?

【问题讨论】:

  • “我不知道 XML 文件的结构。它是由用户定义的。” 您至少必须知道“行”是什么。
  • 文件中的元素是否已排序?如果是,您可以使用向前扫描文件,一次只读取一个元素。即使没有,您也可以一次从其中一个文件中读取一个元素,并将另一个元素保存在内存中。查看 SAX API 以获取有关如何执行此操作的示例。
  • 数据是否以任何方式排序? Mkaes 有很大的不同。
  • 我认为 Alex Siepman 的链接是您的最佳答案。使用 XmlReader 仅向前读取新文件,并为每个元素使用该答案中描述的技术在旧文件中查找相应的元素。

标签: c# xml linq


【解决方案1】:

您应该离开 XML 是绝对正确的。对于这种大小的数据集,它不是一个好的工具,特别是如果数据集由许多具有相同结构的“记录”组成。不仅 4GB 的文件很笨重,而且您用来加载和解析它们的几乎任何东西都将使用比文件大小更多的内存开销。

我建议您查看涉及 SQL 数据库的解决方案,但我不知道在您“不知道 [文件] 结构”的情况下分析 4GB 文件有什么意义,因为“它由用户定义”。如果您不了解文件的结构,您对“行”和“主键”有何意义?您对 XML 了解多少?

这可能是有道理的,例如。读取一个文件,将所有具有主键的记录存储在一定范围内,对另一个文件执行相同的操作,比较该数据,然后继续。通过对键空间进行分段,您可以确保始终找到匹配项(如果存在)。以同样的方式将文件分成更小的块也可能有意义(尽管我仍然认为这么大的 XML 存储通常是不合适的)。你能多说一下这个问题吗?

【讨论】:

  • XML 是一种很好的格式,尤其是在处理不同的数据结构和技术时。
  • 那条评论是什么意思?
  • -1 表示“XML 是一种工具”。它不是,它是一种文件格式,它既可互操作,又易于序列化为另一种格式,这样可以更快地搜索以回答 OP 的原始问题。
  • 是否容易序列化首先取决于数据是否适合XML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多