2016-07-28 7 views
0

В настоящее время я пытаюсь прочитать большую таблицу из компактной базы данных ce, содержащей aprox 3-4 миллиона строк. Размер базы данных i в настоящее время составляет 832 МБ. Наполнения списка с записями бросают OutOfMemoryExceptionC# DbDataReader populating Результат списка в OutOfMemoryException

Код макета:

using (var con = new DomainContext()) 
    { 
     foreach (var item in con.logRecords) 
     { 
      if (item.Info != null && item.Info != "") 
       item.Timestamp = DateTime.ParseExact(item.Info, "MM.dd.yyyy HH:mm:ss.fff", culture).Ticks; 
     } 
     con.SaveChanges(); 

    } 

Нового подхода, до сих пор не получить его на работу ....

 Task.Factory.StartNew(() => 
     { 
      using (var con = new DomainContext()) 
      { 
       for (int i = 0; i < 300; i++) 
       { 
        try 
        { 
         var temp = con.logRecords.Where(p => p.Id <= i * 10000 + 10000 && p.Id >= i * 10000); 

         foreach (var item in temp) 
         { 

          if (item.Info != null && item.Info != "") 
           item.Timestamp = DateTime.ParseExact(item.Info, "MM.dd.yyyy HH:mm:ss.fff", culture).Ticks; 
         } 

         con.SaveChanges(); 

        } 
        catch { } 
        GC.Collect(); 
        Console.WriteLine(i.ToString()); 


       } 
      } 
     }); 
+2

Потому что вы всегда используете один и тот же строковый литерал во втором коде. Это интернировано в пуле строк .NET. Если вы будете использовать 'new String (« WGwegWEGwegWEGWEGWEGWEGWEGWEG ».ToCharArray()), вы получите одно и то же исключение, потому что строки, инициализированные с помощью конструктора, не интернированы. –

+0

Ах, точно! Благодаря! Я предполагаю, что мне нужно выяснить, как это сделать в пакетах .... – Snovva1

+1

Лучшей оптимизацией было бы не загружать все в память, а обрабатывать группу записей (под пейджинг базы данных) или опускать записи (используя 'WHERE ... '). –

ответ

0

Я использовал родную SQL, анализируется временная метка по метке SQL, а затем с 1970 года находит номер в секундах с использованием DATEDIFF (datepart, startdate, enddate). Добавлено количество секунд с года 0. Я теряю миллисекунду, но я думаю, что это следующая лучшая вещь.

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