Meh*_*ard 7 c# memory arrays jagged-arrays multidimensional-array
我正在尝试初始化三维数组以加载体素世界.
地图的总大小应为(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;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢所有试图帮助我理解和解决我的问题的工作人员。
我尝试了几种解决方案来加载大量数据并将其存储在表中。两天后,这是我的测试,最后是可以将 4'191'893'824条目存储到一个数组中的解决方案
我添加我的最终解决方案,希望有人可以帮助
我记得目标:初始化一个整数数组[2048/1024/2048]用于存储4'191'893'824数据
系统抛出内存不足异常
/* ******************** */
/* Jagged Array method */
/* ******************** */
// allocate the first dimension;
bigData = new int[2048][][];
for (int x = 0; x < 2048; x++)
{
// allocate the second dimension;
bigData[x] = new int[1024][];
for (int y = 0; y < 1024; y++)
{
// the last dimension allocation
bigData[x][y] = new int[2048];
}
}
Run Code Online (Sandbox Code Playgroud)
系统抛出内存不足异常(将大数组分成几个小数组.. 不起作用,因为“List <>”允许像简单数组一样最大“2GB”Ram 分配。)
/* ******************** */
/* List method */
/* ******************** */
List<int[,,]> bigData = new List<int[,,]>(512);
for (int a = 0; a < 512; a++)
{
bigData.Add(new int[256, 128, 256]);
}
Run Code Online (Sandbox Code Playgroud)
我终于找到了解决办法!使用“内存映射文件”类包含虚拟内存中的文件内容。
MemoryMappedFile MSDN与我在 codeproject上 找到的自定义类一起使用。初始化很长,但效果很好!
/* ************************ */
/* MemoryMappedFile method */
/* ************************ */
string path = AppDomain.CurrentDomain.BaseDirectory;
var myList = new GenericMemoryMappedArray<int>(2048L*1024L*2048L, path);
using (myList)
{
myList.AutoGrow = false;
/*
for (int a = 0; a < (2048L * 1024L * 2048L); a++)
{
myList[a] = a;
}
*/
myList[12456] = 8;
myList[1939848234] = 1;
// etc...
}
Run Code Online (Sandbox Code Playgroud)