当从数据库中提取大量数据时,内存不足异常

问题描述:

我们正在从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); 
} 

请帮我解决这个问题。

+0

您可以通过提取仅1000行并检查返回的DataSet的大小来计算数据集大小吗?然后乘以25并检查您的服务器是否有足够的内存。注意ASP.NET,IIS和Windows Server体系结构可能会有一些限制,所以如果你遇到任何限制,那么即使服务器有2TB的内存也无济于事......但首先检查你的实际数字... – 2012-02-07 11:52:48

+0

为什么不写一个查询来限制你从数据库中获取的行数。重复它,直到你将它们全部导出。 – onatm 2012-02-07 11:53:19

+2

您需要传输数据,将数据导出到脱机数据集,使用DataReader遍历记录集中的每一行,这样您就不会一次吞下内存。 – Mantorok 2012-02-07 11:53:23

要求读取数据并将其导出到电子表格,因此 分页不是选择。

为什么不能在步骤读取数据。而不是一次获取所有记录,为什么不每次都获得有限数量的记录并将它们写入excel。继续操作,直到处理完所有记录

+0

这是我拥有的最后一个选项,因为在这种情况下,我需要解析结果并逐个写入excel。现在我直接将它绑定到gridview并将其呈现给电子表格 – Jeeva 2012-02-07 11:55:28

+0

所以你想要简单的方法:)你应该提到这个问题。 – Reniuz 2012-02-07 11:58:57

+0

在我看来,在GridView中一次显示25000条记录是毫无意义的。我有一种感觉,你只是为了出口到Excel而做这件事。 – 2012-02-07 12:00:45

您可以使用批处理逻辑获取记录分批说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#代码中处理大量数据对象时,最好使用泛型进行研究,因为这不会像类那样强加对象实例化,因此减少了内存占用量。