在C#中创建大(巨大)数组

时间:2017-02-19 13:50:37

标签: c# arrays indexoutofrangeexception large-data

我正在与大阵列的问题作斗争。我需要阅读大量的csv文件并使用它们(制作表并保存它们)。我这样试试

String[,,] pole = new string[5000, 10251, 100];
...

String[] proz = File.ReadAllText("@/../../History/201" + r + "-" + m1 + m2 + "-" + d1 + d2 + "_00/variables_ens.csv").Split(';');

            for (int k = 0; k < 10251; k++)
            {

                int l = k / 99;
                int lk = l * 99;
                int b = k - lk;
                pole[n, l, b] = proz[k];
            }

但在第一行

String[,,] pole = new string[5000, 10251, 100];

它表示超出范围异常,但我确实需要那么多空间。我写的时候

String[,,] pole = new string[100, 10251, 100];

它可以工作,但仅适用于上百个文件。 有什么建议吗?

2 个答案:

答案 0 :(得分:1)

好吧,我认为您需要重新考虑整个策略并实施流式传输IEnumerable<T>File.ReadLines

我没有足够的元素来完全理解你当前实现的目标,但我很确定你试图操作的数据大小太大而无法处理存储器中。

你需要做什么?你在操纵什么数据? 5000个文件,每个1025100行?每个文件都有相同的大小?你真的,真的需要一次加载所有内容吗?

这个问题的答案应该指向正确的方向。我想说你需要使用流媒体来以一种更易于管理的形式(如数据库)高效地加载数据。

答案 1 :(得分:1)

在语句中声明一个5000 * 10251 * 100元素的数组。这是5,125,500,000个元素,这是一个超出单个块内存分配范围的数字(至少在32位系统中)。您可以将数据拆分为2个或3个不同的阵列,也可以使用动态分配结构,如List&lt;&gt;。

相关问题