我需要创建一个相当大的双精度数组,约为12000乘以55000。不幸的是,我收到了内存不足异常。我曾经使用Java进行开发,并且可以更改内存设置。在C#中是否也有这个可能性,还是完全不可能?我正在使用VS 2008。
我需要创建一个相当大的双精度数组,约为12000乘以55000。不幸的是,我收到了内存不足异常。我曾经使用Java进行开发,并且可以更改内存设置。在C#中是否也有这个可能性,还是完全不可能?我正在使用VS 2008。
每个double
占用8字节,所以您试图分配一个略大于5GB的单个数组。即使对于64位CLR,CLR也有每个对象限制约为2GB,换句话说,问题不在于可用的总内存量(尽管如果您没有足够的内存,显然会有问题),而在于每个对象的大小。
我建议您将其拆分为较小的数组,或者在某种描述性的外观后面进行拆分。我不认为有任何方法可以规避单个数组的该限制。
编辑:您可以选择使用数组的数组 - 即“嵌套数组”:
double[][] array = new double[12000][];
for (int i = 0; i < array.Length; i++)
{
array[i] = new double[55000];
}
你认为这样可行吗?
(你不能使用矩形数组 (double[,]
),因为它会有相同的每个对象大小问题。)
Dictionary<int, double>
来存储数据。只要大约一半的值为空,它可能会使用更少的空间。 - Servy由于您无法创建大于2GB的对象,因此可以尝试使用MemoryMappedFile来处理所需大小的内存块。
var data = MemoryMappedFile.CreateNew("big data", 12000L * 55000L);
var view = data.CreateViewAccessor();
var rnd = new Random();
for (var i = 0L; i < 12000L; ++i)
{
for (var j = 0L; j < 55000L; ++j)
{
var input = rnd.NextDouble();
view.Write<double>(i * 55000L + j, ref input);
}
}
这段代码创建了一个名为"big data"的内存映射文件,大小为12000L*55000L。使用Random类生成随机数并将其写入该内存映射文件中,最终生成一个双精度浮点数数组。IList<T>
或其他索引接口中,来防止由于 LOH 碎片而导致的 Out of memory 异常。BigArray<T>, getting around the 2GB array size limit
。可能是你的内存不足(关闭一些程序)或者你已经达到了内存分配限制(大约2GB),这个内存需要是一个连续的块。你可以使用64位机器,这样你将有更多的可用内存,或者我认为你可以使应用程序具有大地址感知能力(如果在这种情况下可能的话,搜索一下就会告诉你如何做)。
相信你可以在Boot.ini文件中添加/3GB开关来实现大地址感知。
LARGE_ADDRESS_AWARE
的 PE 标志时解决这个问题。 - unknown6656