【问题标题】:Optimize memory usage and fastest way to store and retrieve millions of objects优化内存使用和存储和检索数百万对象的最快方式
【发布时间】:2014-10-21 05:02:54
【问题描述】:

在 WPF 中,我想以低内存使用有效地存储数百万个对象并快速检索它。下面是我的示例类。

public class CellInfo

{

public int A { get; set; }

public int B { get; set; }

public string C { get; set; }

public object D { get; set; }

public bool E { get; set; }

public double F { get; set; }

public ClassA G { get; set; }

}

我想存储数百万个CellInfo 对象,每个对象都有自己的标识。我想用那个身份找回它。如果未定义 CellInfo 实例的属性,则需要返回默认值,该值将存储在静态字段中。

所以我只想存储已定义的 CellInfo 对象的属性以及我不想保留在内存中的其他属性,并且可以从静态变量中检索这些属性。

那么任何人都可以建议我以低内存使用率存储和检索数百万个对象的最快方法吗?

注意:我不需要任何额外的软件安装和数据库或任何外部文件来存储它。

【问题讨论】:

  • 您将如何检索它们?一次一个顺序?一次随机一个?一次几个?
  • 我想一次随机检索一个。例如。如果我将它存储在字典中,var cell = Cells[id].但是当我存储数百万个 CellInfo 对象时,它会占用大量内存。我的 CellInfo 类有大约 25 个属性......但我只会更改 CellInfo 实例的几个属性(2 或 3),而其他属性则需要返回默认值。所以我只想保留/存储我定义的属性。
  • 您为什么不想为此使用数据库?如果您不想使用它,您最终会将所有数据存储在 RAM afaik 中。然后,您可以使用任何您想要的集合,它们可能都占用相同数量的空间。

标签: c# wpf performance memory data-structures


【解决方案1】:

您没有指出哪个字段是“自己的身份”,所以我假设 Guid Identity。键入此身份的Dictionary 应该提供最快的检索。

Dictionary<Guid, CellInfo> cells = new Dictionary<Guid, CellInfo>();

如果您已经拥有数据,则可以使用.ToDictionary() 从可枚举中投影键/值映射。

如果您需要同时变异并从多个线程访问集合(或者如果您打算使集合成为静态),您可以使用 ConcurrentDictionary 换出以解决线程安全问题:

在访问一个元素之前,您需要通过ContainsKey(或根据 Amleth 的TryGet)确定该项目是否存在于字典中。如果没有,请使用您的默认元素。因此,建议您隐藏底层字典实现,并通过为您执行此检查的封装助手强制消费者。

【讨论】:

  • 我认为 TryGet 比 ContainsKey 和 Get 更好。我想这取决于是否有比存储对象更多的“默认”对象。
  • 是的,你关于“如何访问数据”的观点也很好——我在这里假设通过密钥访问。其他字段的随机查询将无法执行。
  • 感谢您的快速建议 StuartLC。但我已经尝试过使用 Dictionary。但是当我将数百万个 CellInfo 对象实例存储到字典中时,它会占用大量内存。我的 CellInfo 类有大约 25 个属性....但我只会更改 CellInfo 实例的几个属性(2 或 3),而其他属性则需要返回默认值。所以我只想保留/存储我定义的属性。
  • Sparse Matrix 模式可能适用于此,尽管这通常适用于简单的数据类型,而不是图形(假设 ClassA 本身可能很复杂)。从内存的角度来看,主要需要担心的是堆字段 - objectstringClassA。字符串是不可变的,因此您可以将引用分配给默认值。如果ClassA 是纯的(无法更改,即使是设置器),您也可以将默认单元格的 ClassA 分配给默认值,但需要确保不变性以防止默认引用损坏。
猜你喜欢
  • 2010-11-11
  • 2012-07-13
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 2012-08-01
  • 2012-09-24
  • 2018-02-24
  • 2019-01-03
相关资源
最近更新 更多