我编写了一些用于创建数据库的服务,在数据库或表等中复制了一些记录,所以有很多数据库操作。但即时通讯处理内存问题。其中之一:使用存储过程时出现“内存不足”错误
即时通讯存储程序和填写实体清单记录;
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驱动程序
您是否真的需要将这些查询中的每一个查询的每一行加载到内存中?你不能流式传输结果,以至于你一次只能在内存中保留一小部分内存?另外,不要为整个应用程序使用一个数据库上下文;为每笔交易创造一个新的;它将有助于降低你的内存占用。 – Servy 2013-05-06 13:57:05
@servy,流式结果可能会达到目的,我会试试看。但我的代码会更复杂,不会? – htcdmrl 2013-05-07 10:43:45
并不显着,这取决于你在做什么。使用'IEnumerable'而不是'List'并将这些方法转换为迭代器块(这实际上简化了它们,而不是使它们复杂化)。 – Servy 2013-05-07 13:54:23