2013-05-06 108 views
-1

我編寫了一些用於創建數據庫的服務,在數據庫或表等中複製了一些記錄,所以有很多數據庫操作。但即時通訊處理內存問題。其中之一:使用存儲過程時出現「內存不足」錯誤

即時通訊存儲程序和填寫實體清單記錄;

public List<FpBatteryEntity> LoadFPBattery() 
    { 
     List<FpBatteryEntity> retVal = new List<FpBatteryEntity>(); 

     DataSet dataSet = _dataAccessProvider.ExecuteSPDataSet("sp_fp_battery", null); 
     if (dataSet != null && dataSet.HasData()) 
     { 
      DataTable requestsTable = dataSet.Tables[0]; 
      if (requestsTable != null && requestsTable.HasData()) 
      { 
       foreach (DataRow row in requestsTable.Rows) 
       { 
        FpBatteryEntity entity = new FpBatteryEntity() 
        { 
         Faceplate = row["tf_faceplate"], 
         Battery = row["tf_battery"] 
        }; 
        retVal.Add(entity); 
       } 
      } 
     } 
     return retVal; 
    } 

然後對於列表中的每個實體,執行一個新的sp;

public bool LoadFPBattery(List<FpBatteryEntity> entityList) 
    { 
     foreach (var entity in entityList) 
     { 
      DBParameterCollection parameters = new DBParameterCollection 
      { 
       new DBParameter("@faceplate", SqlDbType.VarChar, entity.Faceplate), 
       new DBParameter("@battery", SqlDbType.VarChar, entity.Battery) 
      }; 

      _dataAccessProvider.ExecuteSPNonQuery("sp_ins_fp_battery", parameters); 
     } 

     return true; 
    } 

不幸的是,我有超過30個這樣的操作,其中一些操作正在處理數千條記錄。

調用這樣的步驟;

 ..... 

     List<MapColorEntity> mapColor = _dbRepository.LoadMapColor(marketId); 
     if (!_otherDbRepository.LoadMapColor(mapColor)) 
      return false; 

     List<AttributesEntity> attributes = _dbRepository.LoadOptionAttrib(marketId); 
     if (!_otherDbRepository.LoadOptionAttrib(OptionAttributes)) 
      return false; 

     List<FpBatteryEntity> fpBattery = _dbRepository.LoadFPBattery(); 
     if (!_otherDbRepository.DelFPBattery()) 
      return false; 
     if (!_otherDbRepository.LoadFPBattery(fpBattery)) 
      return false; 

     ..... 

後5-6步驟操作與破壞 「內存不足」錯誤。我必須逐步完成這些所有操作。只是想知道如果你有建議讓這些操作更加富有成效和流暢。我如何解決這個記憶問題?後面會發生什麼?

用法;

Windows 7操作系統,可用的3Gb拉姆,Sybase ASE的,ODBC驅動程序

+1

您是否真的需要將這些查詢中的每一個查詢的每一行加載到內存中?你不能流式傳輸結果,以至於你一次只能在內存中保留一小部分內存?另外,不要爲整個應用程序使用一個數據庫上下文;爲每筆交易創造一個新的;它將有助於降低你的內存佔用。 – Servy 2013-05-06 13:57:05

+0

@servy,流式結果可能會達到目的,我會試試看。但我的代碼會更復雜,不會? – htcdmrl 2013-05-07 10:43:45

+0

並不顯着,這取決於你在做什麼。使用'IEnumerable'而不是'List'並將這些方法轉換爲迭代器塊(這實際上簡化了它們,而不是使它們複雜化)。 – Servy 2013-05-07 13:54:23

回答

1

我會用DataReader,而不是一個DataTable建議。它看起來像你這樣做的方式將有兩個數據在內存中的副本。

+0

謝謝fr res,也許DataReader會解決我的問題,但我必須使用一個dll,它給了我「_dataAccessProvider.ExecuteSPDataSet」。我不知道爲什麼,但沒有任何DLL方法返回與DataReader :(也許我有更多的可用RAM比3GB,上面的代碼將被正確執行。我認爲寫這個DLL的人,有無限的內存或其他任何東西:)你有任何不同的想法?使我功能 – htcdmrl 2013-05-07 10:35:35

+0

您可能已經閱讀它從DataTable中刪除記錄。 – 2013-05-07 19:26:35

相關問題