0
我目前正试图从包含约3-4百万行的紧凑ce数据库读取大表。我目前的数据库大小为832MB。 填充有记录的列表抛出OutOfMemoryException
C#DbDataReader填充列表结果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 ... ')。 –