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

本文关键字:内存不足 异常 数据 数据库 提取 | 更新日期: 2023-09-27 18:22:46

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

请帮我解决这个问题。

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

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

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

您的问题完全是因为您试图一次提取这么多数据。您可以通过在执行查询的机器中安装更多内存来解决这个问题,但这只是一个难题。

您最好分步骤检索如此大量的数据。

您可以很容易地逐行读取数据,并将其以CSV格式导出/附加到文件中,这一切都可以在存储过程中完成。

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

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

您可以使用批处理逻辑来批量获取记录,比如每次执行5000条记录,并在完成所有处理后将结果存储在临时数据集中。将数据从临时数据集转储到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

这是一种速度更快、占地面积小的方法。