2017-02-19 69 views
-1

我正在与一个大阵列的问题斗争。我需要阅读大量的csv文件并使用它们(制作表格并保存它们)。我尝试这样在C中创建大型(巨大)数组#

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]; 

它的工作原理,但只适用于这些文件的数百个。 有什么建议吗?

+0

你可以使用List <>来代替数组,它更加灵活。您应该需要它不是每个CSV都具有相同数量的内容。所以这个列表可以增长并且没有硬编码的索引范围。 –

+3

好,如果你说的是“IndexOutOfRangeException”的情况,这不是你访问一个不存在的元素的大小问题,因此你应该使用动态数据结构,也许列表 –

+0

重建你的项目为x64,然后再试一次。如果这不起作用,请获取更多内存。 – dasblinkenlight

回答

1

嗯,我认为你需要重新思考你的整个策略,并实施流媒体视频IEnumerable<T>File.ReadLines

我没有足够的元素来完全理解你试图用你当前的实现来实现什么,但我敢肯定,你试图操作的数据的大小太大了,无法处理在记忆中。

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

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

1

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