将数据存储在内存中,这是一个好方法吗?

时间:2010-12-11 13:25:34

标签: c# .net memory

我有一个items.xml文件,一旦应用程序启动就会加载到内存中。 items.xml中的每个元素都“转换”为类型Item(只有很少的int& string属性),然后添加到项列表中。项目列表应包含数千个Item个实例。

将数据存储在对象(我的示例中为Item类)中可以吗?还有另一种方法可以将这些数据存储在内存中吗?

5 个答案:

答案 0 :(得分:7)

首先担心正确使用该功能。其次,担心性能。分析应用程序并查看其在性能方面受到的影响。它可能永远不会在您的配置中。但是,如果您在此区域遇到性能问题,请尝试为项目的单个或子集创建密钥。这样,您可以使用键和项目(或项目列表)填充一个或多个词典,从而减少对相关项目的访问时间。

请记住,这些查找字典“便宜”,因为它们只存储对项目的引用,而不是对象的副本。

答案 1 :(得分:5)

没关系,只要你确保你不吃所有,记忆应该没问题。我已经为具有更大数字的复杂系统做了这个。

如果您的数据经常被列表中的索引其他访问,您可能需要使用字典来索引该项目,例如:

Dictionary<string, Item> lookup =
    list.ToDictionary(x => x.Code);

然后您可以访问:

Item item = lookup["abc012"];

也;如果许多字符串值重复使用,你可以通过编写自己的内部函数来节省一些空间;

Dictionary<string,string> interner =
    new Dictionary<string,string>();
foreach(Item item in list) {
    string s, name = item.Name;
    if(interner.TryGetValue(name, out s))
        item.Name = s;
    else
        interner.Add(name, name);
}

仅通过保留和重复使用唯一字符串来减少内存使用

答案 2 :(得分:1)

这很好,无论如何你会使用一种类型的对象,所以自定义对象是一个不错的选择。

还有其他方法可以加载和查询XML数据 - 例如使用XDocument并使用Linq to XML查询。

答案 3 :(得分:0)

在不确切知道这些Item对象的用途的情况下,我无法肯定地说,但你所描述的内容听起来完全没问题。

如果你有100,000个这些对象(而不是1,000个),那么List将不是最好的数据结构。这有两种方法。将其保留为列表,然后在它成为问题时处理它,或者立即修复它。

前者意味着你现在没有工作要做,但是你将来还有一些未知的工作要做 - 以后会对更改数据结构产生更多潜在影响(更多代码需要更改,可能错误被引入)。

后者意味着现在已经完成了大量工作,但是(希望)将来没有工作,因为您选择了可扩展的数据结构。但是,要注意过早优化。如果你的名单永远不会超过目前的规模,你就完成了这项工作,但没有收获。

答案 4 :(得分:0)

您的商品列表是只读的,还是需要处理修改?如果它是只读的,那么到目前为止每个人的建议都很好。如果您的内存中对象是可修改的,那么还有很多问题没有得到解答。

如果您要处理修改,您将如何:

  1. ...处理并发访问?
  2. ...将商品列表同步回XML文档?
  3. 如果有人修改了基础XML文档,
  4. ...会使您的内存缓存失效吗?
  5. ...如果应用程序崩溃/重新启动,请确保不丢失数据?
  6. 使用内存中的对象进行快速访问是一种很好的做法,我自己一直这样做。但如果您的数据不稳定,那么这不是一个简单的解决方案。在这种情况下,您应该使用符合ACID的数据库。