当从数据库中提取大量数据时,内存不足异常
问题描述:
我们正在从sql server数据库中提取大量数据。它有大约25000行,2500列。要求是读取数据并将其导出到电子表格,因此分页不是一种选择。当记录较少时,它可以提取数据,但当它增长到我上面提到的大小时,就会抛出异常。当从数据库中提取大量数据时,内存不足异常
public DataSet Exportexcel(string Username)
{
Database db = DatabaseFactory.CreateDatabase(Config);
DbCommand dbCommand =
db.GetStoredProcCommand("Sp_ExportADExcel");
db.AddInParameter(dbCommand, "@Username", DbType.String,
Username);
return db.ExecuteDataSet(dbCommand);
}
请帮我解决这个问题。
答
要求读取数据并将其导出到电子表格,因此 分页不是选择。
为什么不能在步骤读取数据。而不是一次获取所有记录,为什么不每次都获得有限数量的记录并将它们写入excel。继续操作,直到处理完所有记录
答
您可以使用批处理逻辑获取记录分批说5000个记录每次执行和结果存储在一个临时数据集,一旦所有的处理完成。将temp数据集中的数据转储到excel。
您可以使用C#BulkCopy类来达到此目的。
答
如果它足以在Excel中提供CSV数据,您可以使用批量复制
bcp "select col1, col2, col3 from database.schema.SomeTable" queryout "c:\MyData.txt" -c -t"," -r"\n" -S ServerName -T
这是mangnitudes速度更快,具有小足迹。
答
你的问题纯粹是由于你试图一次性提取如此多的数据。 您可以通过在执行查询的计算机中安装更多内存来解决此问题,但这只是一个陷阱。
您最好在步骤中检索这些数据量。
你可以很容易地读取数据回来行和进出口行/添加在CSV格式的文件,这可能都在一个存储过程来完成。
你不说你用的是什么数据库,但处理如此大量的数据是什么样的数据库引擎的设计,以应付。
除了在C#代码中处理大量数据对象时,最好使用泛型进行研究,因为这不会像类那样强加对象实例化,因此减少了内存占用量。
您可以通过提取仅1000行并检查返回的DataSet的大小来计算数据集大小吗?然后乘以25并检查您的服务器是否有足够的内存。注意ASP.NET,IIS和Windows Server体系结构可能会有一些限制,所以如果你遇到任何限制,那么即使服务器有2TB的内存也无济于事......但首先检查你的实际数字... – 2012-02-07 11:52:48
为什么不写一个查询来限制你从数据库中获取的行数。重复它,直到你将它们全部导出。 – onatm 2012-02-07 11:53:19
您需要传输数据,将数据导出到脱机数据集,使用DataReader遍历记录集中的每一行,这样您就不会一次吞下内存。 – Mantorok 2012-02-07 11:53:23