В настоящее время я пытаюсь прочитать большую таблицу из компактной базы данных ce, содержащей aprox 3-4 миллиона строк. Размер базы данных i в настоящее время составляет 832 МБ. Наполнения списка с записями бросают OutOfMemoryException
C# 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());
}
}
});
Потому что вы всегда используете один и тот же строковый литерал во втором коде. Это интернировано в пуле строк .NET. Если вы будете использовать 'new String (« WGwegWEGwegWEGWEGWEGWEGWEGWEG ».ToCharArray()), вы получите одно и то же исключение, потому что строки, инициализированные с помощью конструктора, не интернированы. –
Ах, точно! Благодаря! Я предполагаю, что мне нужно выяснить, как это сделать в пакетах .... – Snovva1
Лучшей оптимизацией было бы не загружать все в память, а обрабатывать группу записей (под пейджинг базы данных) или опускать записи (используя 'WHERE ... '). –