据我所知,.NET中的单个实例有2 GB的限制.我没有太多关注,因为到目前为止我主要使用32位操作系统.在32但它或多或少是一个人为的限制.但是,我很惊讶地发现这个限制也适用于64位.NET.
由于诸如List<T>使用数组来存储项目之类的集合,这意味着与在64位上运行的相同应用程序相比,在32位上运行的.NET应用程序将能够在列表中保存两倍的引用类型项.这非常令人惊讶.
有谁知道这个限制是否在CLR 4.0中得到解决(目前我手头没有安装4.0).
我试图向Collection中添加大量元素,每个简单数据传输对象的元素具有基本数据类型的五个属性,没什么特别之处.
在循环中添加新条目时,我总是得到一个OutOfMemoryException.有趣的是,在尝试添加8388608th元素(8*1024*1024)时,我总是得到异常.因此,我假设此类集合中允许的容量(元素数量)存在内置限制,但我找不到任何有关它的信息.
这个限制确实存在吗?我会在哪里找到这个记录?
关于集合中可以包含的最大项目数的主要问题,例如List.我在这里寻找答案,但我不理解这个推理.
假设我们正在与一个List<int>具有sizeof(int)= 4个字节......每个人都似乎是确保为64,你可以有一个最大268435456 int和x86的最大134217728 int.链接:
但是,当我自己测试时,我发现x86并非如此.谁能指出我可能出错的地方?
//// Test engine set to `x86` for `default processor architecture`
[TestMethod]
public void TestMemory()
{
var x = new List<int>();
try
{
for (long y = 0; y < long.MaxValue; y++)
x.Add(0);
}
catch (Exception)
{
System.Diagnostics.Debug.WriteLine("Actual capacity (int): " + x.Count);
System.Diagnostics.Debug.WriteLine("Size of objects: " + System.Runtime.InteropServices.Marshal.SizeOf(x.First().GetType())); //// This gives us "4"
}
}
Run Code Online (Sandbox Code Playgroud)
对于x64:268435456(预期)
对于x86:67108864(比预期少2倍)
为什么人们说包含134217728的List int …
public class List<T>\n{\n public int Count\n {\n get;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我注意到Count是一个int,结果会小于 0\xef\xbc\x9f
如果Count可以小于0,我必须写\xef\xbc\x9a
if(myList.Count < 1)\n{\n \n}\nRun Code Online (Sandbox Code Playgroud)\n否则我可以这样写:
\nif(myList.Count == 0)\n{\n \n}\nRun Code Online (Sandbox Code Playgroud)\n 我对C#有点新意,我遇到了性能问题.在我的程序中,人们导入一个.txt列表,程序会从中列出一个列表; 问题是它消耗了太多内存,导致PC内存不足而崩溃.我想过使用'yield'而没有成功.有任何想法吗?
private List<string> ImportList()
{
try
{
using (var ofd = new OpenFileDialog() { Filter = "Text files (*.txt) | *.txt" })
{
if (ofd.ShowDialog() == DialogResult.OK)
{
return File.ReadAllLines(ofd.FileName).ToList();
}
}
return null;
}
catch(OutOfMemoryException ex)
{
MessageBox.Show("The list is too large. Try using a smaller list or dividing it.", "Warning!");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)