2017-02-19 4 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», это не проблема размера, с которой вы обращаетесь к несуществующему элементу, поэтому вы должны использовать динамическую структуру данных, возможно, List –

+0

Перестройте свой проект как x64, затем повторите попытку. Если это не работает, получите больше памяти. – dasblinkenlight

ответ

1

Ну, я думаю, вам нужно переосмыслить всю вашу стратегию и реализовать потоковое vie IEnumerable<T> и File.ReadLines.

У меня недостаточно элементов, чтобы полностью понять, чего вы пытаетесь достичь с помощью текущей реализации, но я уверен, что размер данных, которые вы пытаетесь манипулировать, слишком много для обработки в памяти.

Что вам нужно сделать? Какие данные вы манипулируете? 5000 файлов по 1025100 строк? Каждый файл имеет одинаковый размер? Вы ДЕЙСТВИТЕЛЬНО, ДЕЙСТВИТЕЛЬНО нужно загружать все сразу?

Ответы на этот вопрос должны указывать на вас в правильном направлении. Я бы сказал, вам нужно использовать потоковое видео для эффективной загрузки данных в более удобной форме (например, в базе данных).

1

В своем заявлении вы объявляете массив из 5000 * 10251 * 100 элементов. Это 5 125 500 000 элементов, которые являются пределами диапазона для распределения памяти в одном блоке (по крайней мере, в 32-битных системах). Вы можете разделить свои данные на 2 или 3 разных массива или использовать динамическую структуру распределения, такую ​​как Список <>.

Смежные вопросы