【发布时间】:2013-04-17 05:56:35
【问题描述】:
我正在尝试初始化一个三维数组以加载体素世界。
地图的总大小应为 (2048/1024/2048)。我试图初始化一个“int”的锯齿状数组,但我抛出了一个内存异常。尺寸限制是多少? 我的桌子大小:2048 * 1024 * 2048 = 4'191'893'824
有人知道有办法解决这个问题吗?
// System.OutOfMemoryException here !
int[][][] matrice = CreateJaggedArray<int[][][]>(2048,1024,2048);
// if i try normal Initialization I also throws the exception
int[, ,] matrice = new int[2048,1024,2048];
static T CreateJaggedArray<T>(params int[] lengths)
{
return (T)InitializeJaggedArray(typeof(T).GetElementType(), 0, lengths);
}
static object InitializeJaggedArray(Type type, int index, int[] lengths)
{
Array array = Array.CreateInstance(type, lengths[index]);
Type elementType = type.GetElementType();
if (elementType != null)
{
for (int i = 0; i < lengths[index]; i++)
{
array.SetValue(
InitializeJaggedArray(elementType, index + 1, lengths), i);
}
}
return array;
}
【问题讨论】:
-
您的
CreateJaggedArray方法不是创建一个锯齿状数组,而是创建一个多维数组,非常具体地不是一个锯齿状数组。 -
@MehdiBugnard 看看变量
int[, ,] matrice的类型即可。如果它是一个锯齿状数组,它需要是int[][][]。 -
如果世界大多是“空白空间”,那么你可以做得比大数组更好。通常的技术是使用八叉树:en.wikipedia.org/wiki/Octree
-
@Filip:确实。此外:由于一个 int 是 4 个字节,天真地表示所有 40 亿个体素将消耗 160 亿字节的 虚拟地址空间。在 32 位进程上,只有 2 GB 的虚拟地址空间可用周期。 (当然,虚拟内存本质上是无限的;请记住,内存可用性受磁盘大小而不是物理内存大小的限制。但是 32 上的 虚拟地址空间非常有限位处理器。)如果结构中有大量冗余,八叉树可以将其压缩到非常易于管理的大小。
-
@MehdiBugnard:我建议您首先不要尝试将数据加载到大数组中。只需将其直接加载到您的八叉树中即可。
标签: c# arrays memory multidimensional-array jagged-arrays