从DB中提取大量数据时出现内存不足异常

时间:2012-02-07 11:50:05

标签: c# asp.net .net memory-management

我们正在从sql server DB中提取大量数据。它有大约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);
}

请帮我解决这个问题。

4 个答案:

答案 0 :(得分:3)

  

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

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

答案 1 :(得分:0)

您可以使用批处理逻辑批量获取记录,每次执行5000条记录,并将结果存储在临时数据集中,并且一旦完成所有处理。将数据从临时数据集转储到Excel。

您可以使用C#BulkCopy类来实现此目的。

答案 2 :(得分:0)

如果将Excel中的数据作为csv提供就足够了,您可以使用批量复制

bcp "select col1, col2, col3 from database.schema.SomeTable" queryout  "c:\MyData.txt"  -c -t"," -r"\n" -S ServerName -T

这种情况更快,而且占地面积小。

答案 3 :(得分:0)

您的问题完全取决于您试图一次性提取如此多的数据。 你可以通过在执行查询的机器中安装更多内存来解决问题,但这只是一个小窍门。

您最好逐步检索此类数据。

您可以非常轻松地逐行读取数据并将CSV格式的数据导出/附加到文件中,这可以在存储过程中完成。

您没有说明您使用的数据库,但处理如此大量的数据是数据库引擎的设计目标。

除了在C#代码中处理大量数据对象时,最好使用泛型,因为这不会像对象那样强制执行对象实例化,因此会减少内存占用。