【问题标题】:Best way of storing very large number of objects in memory?在内存中存储大量对象的最佳方法?
【发布时间】:2010-11-30 14:02:44
【问题描述】:

非常简单的问题,您在内存中存储 100 KB - 2 MB 对象的方式是什么?对象由 3 个双精度数和两个字符串组成(大部分都在 5 个字符以下)。使用 struct 代替 class 会更好吗?

编辑:我不知道为什么我说双精度,它是浮点数..:S

【问题讨论】:

  • 这取决于对象之间的关系。
  • 这是关于带有属性的点
  • 浮动是有原因的吗?这些点是否比 Decimal 可以处理的更大或更精确?
  • @William:Decimal 在这里有什么好处?
  • 十进制为 128bit 大小,浮点数仅为 32 ...

标签: .net collections object numbers


【解决方案1】:

在处理大量对象时需要考虑两个主要问题。

Frederik Gheysels 的answer 通过使用 Fly weight 模式解决了第一个问题,即内存问题。

第二个问题是如何有效地添加和检索这些对象/结构(取决于您选择遵循的路径)。显然,我假设您不只是创建这些对象,并且永远不想再次检索它们;)

不过,要回答这个问题,这实际上取决于您希望如何添加和访问数据。从那里您可以决定哪种数据结构最适合您的任务。例如,您可能希望以 LIFO 顺序处理这些对象,那么堆栈将是最有效的方式。

【讨论】:

    【解决方案2】:

    我不太了解你在做什么,但是这些经验法则怎么样?

    如果您必须将点存储在某种集合中,则将它们设为类以节省装箱结构的存储开销。

    如果您只是将这些点用作另一个对象的输入数据进行处理,例如作为网格中的点进行处理,然后更喜欢使用数组来节省 Collection 类的开销。

    如果您将点存储在数组中,那么只需将它们设为结构,因为这比将它们设为类更有效。

    【讨论】:

      【解决方案3】:

      我怀疑结构和类之间存在差异,当然在 C++ 中它们本质上是相同的。您建议的 2M 对象在现代桌面系统上并没有那么大。

      【讨论】:

      • 在 .NET 中有很大的不同,因为结构是值类型并分配在堆栈上,而类是引用类型并分配在堆上。
      • 这个问题被标记为 .NET,所以我认为 OP 不是在询问 C++。但你说得完全正确,2M 这么大的物体并不稀奇。
      • @Frederik:这只是部分正确。值类型!= 在堆栈上分配!!!见stackoverflow.com/questions/1130468/…
      • divo:在栈上分配了一个值类型; Jon Skeet 在您链接到的帖子中所说的是一种不同的情况,其中值类型是引用类型的成员......这是一个不同的故事。
      • 我的意思是,您的陈述似乎表明结构存储在堆栈中因为它们是值类型。这是不正确的。还可以看看 Eric Lippert 的精彩解释:blogs.msdn.com/ericlippert/archive/2009/04/27/…
      【解决方案4】:

      有机会使用Flyweight pattern 吗?

      如果您的类型表示值类型,则可以使用结构。 结构的分配和解除分配成本更低。考虑到设计指南,您可以在以下情况下使用结构:

      • 该类型的实例大小小于 16 字节。
      • 实例是短暂的
      • 实例是不可变的(所有值类型都应该是恕我直言)。

      【讨论】:

      • 前 3 个双打是点坐标,都不同,所以任何机会都在这些字符串上,但非常值得怀疑:/
      猜你喜欢
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2015-05-10
      相关资源
      最近更新 更多