2015-09-01 3 views
-2

Я пытаюсь прочитать данные текстового файла с помощью «|» разделенный, я использую ниже код. Я м способен считывать данные из текстового файла после чтения при попытке поставить DataTable данных в DataView я получаю исключение типа «System.OutOfMemoryException» был брошен,Исключение типа «System.OutOfMemoryException» было выбрано при чтении данных из текстового файла

Может ли один предложить мне, как избежать этого исключения ,

string filepath = System.Configuration.ConfigurationManager.AppSettings["data"]; 

if (filepath != "") 
      { 
       DataTable dt = new DataTable("file"); 
       string[] columns1 = null; 
       var lines = File.ReadAllLines(filepath); 
       int Count = lines.Length; 
       //here taking columns and adding to table 
       if (lines.Count() > 0) 
       { 
        columns1 = lines[0].Split(new char[] { '|' }); 
        foreach (var column in columns1) 
         dt.Columns.Add(column); 
       }     
       for (int i = 1; i < lines.Count(); i++) 
       { 
        DataRow dr = dt.NewRow(); 
        string[] values = lines[i].Split(new char[] { '|' }); 
        for (int j = 0; j < values.Count() && j < columns1.Count(); j++) 
        { 
         dr[j] = values[j]; 
        } 

       } 
       dt.Rows.Add(dr); 

        DataView View = new DataView(dt); 
        //Here I m getting "Exception of type 'System.OutOfMemoryException' was thrown." 
        DataTable MD = View.ToTable("MD", false, "ID", "Description") 
        DataTable MM = View.ToTable("MM", false, "RecordNumber", "Item description") 
       if (MD.Rows.Count > 0) 
       { 
        InsertData(MD); 
       } 
       if (MM.Rows.Count > 0) 
       { 
        InsertData1(MM); 
       } 
      } 

StackTrace: -

at System.Collections.Generic.List`1.set_Capacity(Int32 value) 
    at System.Collections.Generic.List`1.EnsureCapacity(Int32 min) 
    at System.Collections.Generic.List`1.Add(T item) 
    at System.Data.DataView.ToTable(String tableName, Boolean distinct, String[] columnNames) 
+2

что размер файла? – wudzik

+0

Линия исключения (полная трассировка). Проблема, скорее всего, размер файла или количество записей в вашем файле, превышающее максимальное количество элементов, разрешенных в списке. – Kilazur

+0

Я пытаюсь прочитать текстовый файл, содержащий 5 записей записей. –

ответ

0

Несколько использования String.Split могут вызвать OutOfMemoryException. Загрузите Lumenworks Fast CSV Reader - проблема решена. Вы получите его здесь: http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

Для получения более подробной информации по вопросам с Сплите, взгляните на следующие ссылки:

http://vpnchoudhary.blogspot.ie/2011/03/out-of-memory-exception-simple.html

string.split() "Out of memory exception" when reading tab separated file

Соответствующие цитаты здесь:

Что происходит, когда вы выполняете разделение на строку, содержащую запятую 1355049, разделенные строки 16 символов каждый из которых имеет общую длину символа из 25745930?

Массив указателей на строки объект: прилежащей виртуальный адрес пространства 4 (указатель адреса) * 1355049 = 5420196 (размер массива) + 16 (для бухгалтерского учета) = 5420212. несмежного виртуальных адресного пространства для 1355049, каждый из 54 байтов. Это не значит, что все эти 1,3 миллионов строк будут разбросаны по всей куче, но они будут не выделяться на LOH. GC будет выделять их на пучки на Gen0 кучи. Split.Function создаст внутренний массив System.Int32 [] из размера 25745930, потребляющий (102983736 байт) ~ 98 МБ Лоха, что очень дорого Л.

+0

«Множество использования String.Split, скорее всего, вызовет исключение OutOfMemoryException». - Вы действительно должны ссылаться на свои источники, если вы собираетесь подать такое заявление. – theB

+0

Я предоставил править - пожалуйста, удалите ваш downvote. – GinjaNinja

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