我应该使用什么来临时存储将被重用的XML数据?

时间:2010-11-24 06:01:39

标签: c# xml collections

我有一个 47mb XML文件,我必须在我的应用程序上一遍又一遍地阅读,但大多数情况下它只需要一个给定术语定义的1个节点。

示例:

<customers>
    <customer>
        <id>someid</id>
        <name>somename</name>
    </customer>
    <customer>
        <id>someid</id>
        <name>somename</name>
    </customer>

    ...

    <customer>
        <id>someid</id>
        <name>somename</name>
    </customer>
    <customer>
        <id>someid</id>
        <name>somename</name>
    </customer>
</customers>

所以我想在程序加载后将xml加载到Dictionary或List中,并在应用程序关闭之前将其保留在那里重复使用。

  • 我想知道的是什么 为它存储的最佳类型?

如果我必须使用字典,例如:

private Dictionary<int,string> myCustomerList = new Dictionary<int,string>();

我可以稍后使用它来获取我需要的信息:

if (myCustomerList.ContainsKey(keyX))
    myValue = myCustomerList[keyX];
  • 这是一个不好的方式或什么 我应该看看吗?

4 个答案:

答案 0 :(得分:1)

您的方法没有任何功能上的错误,但是当向客户添加更多信息时会发生什么? 例如,您可能有一个“location”元素:

   <customer>
        <id>someid</id>
        <name>somename</name>
        <location>somename</location>
    </customer>

还要考虑将数据移动到数据库的情况 - 您必须重写大量代码。

在应用程序的持续时间内直接使用XML对象通常被认为是不好的做法。 “正确”的方法是首先将XML数据加载到面向对象的对象中。

您应该创建一个名为Customer的类,并使用List<Customer> customers =new List<Customer>()来存储对象。然后,您可以使用customers.Find(x=>x.Id == myId)找到您的对象。

请记住,如果将对象存储在内存中,应用程序将使用至少47mb的RAM。随着您的业务获得更多客户,这可能会增长。也许您应该考虑延迟加载客户(在需要时从XML文件中检索它们) - 这将更慢,因此它实际上取决于您的吞吐量和数量要求。

答案 1 :(得分:1)

你的approch非常正确。如果以后将更多信息添加到客户类,则使用list generic class,否则您的approch是正确的。

列表 - 我最喜欢的一个 - 可以与泛型一起使用,因此您可以使用强类型数组,例如:名单。除此之外,其行为与ArrayList非常相似。

字典 - 与上面相同,仅通过泛型强类型,例如Dictionary

一直使用List和Dictionary。

答案 2 :(得分:1)

我想说47 MB​​的文件,在数据表中一次加载将非常容易,也有利于搜索。

您应该考虑使用WeakReferences将此数据表存储在内存中。

答案 3 :(得分:1)

47MB是应用程序始终保留在内存中的相当大的数据。

但是,您可以将XmlReaderXNode.ReadFrom结合使用,以读取内存较少的大型Xmls。

  

您可以使用此方法编写一个返回节点集合的方法,在读取节点时生成每个节点。通过此方法,您可以处理任意大型XML 文件,而内存占用非常小。