2016-07-28 55 views
0

我目前正試圖從包含約3-4百萬行的緊湊ce數據庫讀取大表。我目前的數據庫大小爲832MB。 填充有記錄的列表拋出OutOfMemoryExceptionC#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()); 


       } 
      } 
     }); 
+2

因爲您總是在第二個代碼中使用相同的字符串文字。這是在.NET字符串池中執行的。如果您使用'new String(「WGwegWEGwegWEGwegWEGwegWEGweg」.ToCharArray())'',您將得到相同的異常,因爲通過構造函數初始化的字符串不會被截取。 –

+0

啊,沒錯!謝謝!我想我必須弄清楚如何在批處理中執行此操作.... – Snovva1

+1

最佳的優化方式是不將所有內容加載到內存中,而是處理組記錄(通過數據庫分頁)或通過省略記錄(使用WHERE ... ')。 –

回答

0

我用本地的SQL,解析時間戳爲SQL時間戳,然後找到自1970年以來使用DATEDIFF(datepart,startdate,enddate)的秒數。自0年起增加秒數。我失去了毫秒級的部分,但我認爲這是下一個最好的事情。