2013-05-06 109 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

相关问题