【问题标题】:How many objects of some specific class I can add to List我可以将多少特定类的对象添加到列表中
【发布时间】:2015-03-30 13:51:15
【问题描述】:

我知道您可以在 C# 中添加到 List 的项目数量受 int 限制(因为这是 count 的类型)。应该是 20 亿左右。

但我的问题是说我想要这样的列表:

List<MyClass>= new List<MyClass>;

在哪里

class MyClass
{
  string s1; // should be string of 8 characters always
  DateTime t;
}

我可以添加多少MyClass 的对象到列表中?我假设 现在我必须考虑到内存 它将占用numberOfElements * sizeof(MyClass)? 那么使用这样的约束我可以添加多少元素呢? (我相信我可能会更快地耗尽内存 由于上面的公式,我达到了 int 的最大值,不是吗?)。

【问题讨论】:

  • 由于MyClass是引用类型,所以列表只会包含对对象的引用,所以列表的大小不会有任何不同。
  • 您可以添加尽可能多的元素,因为内存允许每个对象在 .NET 4.5 之前的上限为 2GB 或最多为 int 的最大大小。
  • 对象数量受int上限限制。内存的限制取决于您运行的是 32 位还是 64 位。 SizeOf(class) 也不会告诉你类在内存中的实际大小。这是一个很好的估计,但不准确
  • 不是同一个问题,但请查看该主题的答案:stackoverflow.com/questions/7885294/…
  • 编写一个测试应用程序在与生产机器类似的机器上测试它并不难。如果您在 IIS、.net 版本等中运行...

标签: c#


【解决方案1】:

我可以将多少个 MyClass 对象添加到列表中?我假设现在我必须考虑到它将占用的内存是 numberOfElements * sizeof(MyClass)?

由于MyClass 是引用类型,列表本身只会包含对对象的引用,因此列表的最大大小不会有任何不同。

我相信由于上面的公式,我可能会比达到 int 的最大值更快地耗尽内存,不是吗?

是的,您可能会耗尽内存,但这不是List&lt;T&gt; 的限制。您只受到可用虚拟内存量的限制。

【讨论】:

  • @D Stanley:好的,所以元素的数量 仍然受到 int 大小的限制,对吧?但是考虑到它们仍然占用内存中的某个空间,我可以添加多少元素?
  • @user20034 这取决于你有多少可用的虚拟内存以及字符串有多大(因为它们也会占用虚拟内存)。
  • @D Stanley:字符串长度为 8 个字符。我需要估计。说 4GB RAM 32 位机器?这种机器上的虚拟内存通常有多大?
  • @user20034 计算字符串占用的空间(8*2*n 字节),因为 c# 中的字符串是 16 位 unicode)、字符串引用 (8*n)、DateTimes(8* n 个字节),列表引用 (8*n),并根据您拥有的 virtual 内存量(应该大于 4GB)求解 n。这将是一个非常粗略的估计,并且可能太高了。我会说将数字减半以得出实际最大值。
  • @user20034 或者创建对象并将它们添加到列表中,直到获得OutOfMemoryException。另请注意,虚拟内存由机器上所有正在运行的应用程序(和操作系统)共享,它会随着时间的推移而上升和下降,因此它是一个移动的目标。
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
相关资源
最近更新 更多