从数据库中提取大量数据时出现内存不足异常
本文关键字:内存不足 异常 数据 数据库 提取 | 更新日期: 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
这是一种速度更快、占地面积小的方法。