大型多维数组(Jagged Array)C#的解决方法?

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)

Meh*_*ard 4

非常感谢所有试图帮助我理解和解决我的问题的工作人员。

我尝试了几种解决方案来加载大量数据并将其存储在表中。两天后,这是我的测试,最后是可以将 4'191'893'824条目存储到一个数组中的解决方案

我添加我的最终解决方案,希望有人可以帮助

目标

我记得目标:初始化一个整数数组[2048/1024/2048]用于存储4'191'893'824数据


测试1:使用JaggedArray方法(失败)


系统抛出内存不足异常

            /* ******************** */
            /* 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)

测试2:用List方法(失败)


系统抛出内存不足异常(将大数组分成几个小数组.. 不起作用,因为“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)

测试3:使用MemoryMappedFile(解决方案)


我终于找到了解决办法!使用“内存映射文件”类包含虚拟内存中的文件内容。

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)