这是一个没有实际意义的问题,因为我分配的金额是错误的。原本应该是400MB而不是400GB ......对不起!答案很好。
我正在尝试对我的方法进行单元测试,如果上传了大文件,则会抛出OutOfMemoryException。
我的问题是我的单元测试也抛出了这个异常(出于同样的原因我猜)。
根据任务经理的说法,如果我正确地读取信息,我确实有足够的RAM,所以我不确定为什么我的单元测试失败了。
以下是相应的单元测试代码:
var data = new List<byte>();
for(UInt64 i = 0; i < 400ul * 1024ul * 1024ul * 1024ul; i += 65536ul)
{
data.AddRange(new byte[65536]); // <-- throws exception here when i = 536870912
}
this.UploadedFileData = data.ToArray();
我在上面的代码之前尝试了以下内容:
var data = new byte[400ul * 1024ul * 1024ul * 1024ul];
但是,这会导致错误:算术运算导致溢出。
答案 0 :(得分:4)
你是32位机器吗?
除非使用/ 3GB启动开关,否则32位的进程限制为2GB。
来自C# Increase Heap Size - Is It Possible
您可能需要执行以下操作
对于非常大的List对象,通过在运行时环境中将gcAllowVeryLargeObjects配置元素的enabled属性设置为true,可以将64位系统上的最大容量增加到20亿个元素。
来自http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx
正如大卫所提到的,代码在增长时需要大量重新分配。为了防止性能成本和内存碎片,如果不重写代码,至少应将Capacity
设置为适当的数量。
答案 1 :(得分:1)
最有可能的是你达到了最大分配大小限制(大多数版本为2GB),它需要抛出一些东西--OOM非常适合。
此处包含限制:Single objects still limited to 2 GB in size in CLR 4.0?
旁注:MemoryStream
和List
是不合适的选择,因为需要在连续的内存块中存储底层数据,因此需要将它们慢慢增长到很大的尺寸。预先分配必要的存储量或使用自定义的分块流/列表。
在4.5 CLR之前获得2Gb分配限制的数组样本 - http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx