2017-02-19 74 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個不同的數組,也可以使用動態分配結構,如列表<>。