加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 抛出类型“System.OutOfMemoryException”的异常 为

发布时间:2020-12-16 00:23:53 所属栏目:asp.Net 来源:网络整理
导读:我有一个动态查询返回约59万条记录。它第一次运行成功,但如果我再次运行它,我会继续收到一个System.OutOfMemoryException。可能发生什么原因? 错误发生在这里: public static DataSet GetDataSet(string databaseName,string storedProcedureName,params
我有一个动态查询返回约59万条记录。它第一次运行成功,但如果我再次运行它,我会继续收到一个System.OutOfMemoryException。可能发生什么原因?

错误发生在这里:

public static DataSet GetDataSet(string databaseName,string
                                   storedProcedureName,params object[] parameters)
    {
        //Creates blank dataset
        DataSet ds = null;

        try
        {
            //Creates database
            Database db = DatabaseFactory.CreateDatabase(databaseName);
            //Creates command to execute
            DbCommand dbCommand = db.GetStoredProcCommand(storedProcedureName);
            dbCommand.CommandTimeout = COMMAND_TIMEOUT;
            //Returns the list of SQL parameters associated with that stored proecdure
            db.DiscoverParameters(dbCommand);

            int i = 1;
            //Loop through the list of parameters and set the values
            foreach (object parameter in parameters)
            {
                dbCommand.Parameters[i++].Value = parameter;
            }
            //Retrieve dataset and set to ds
            ds = db.ExecuteDataSet(dbCommand);
        }
            //Check for exceptions
        catch (SqlException sqle)
        {
            throw sqle;
        }
        catch (Exception e)
        {
            throw e; // Error is thrown here.
        }
        //Returns dataset
        return ds;
    }

这是按钮上运行的代码点击:

protected void btnSearchSBIDatabase_Click(object sender,EventArgs e)
{

        LicenseSearch ls = new LicenseSearch();

        DataTable dtSearchResults = new DataTable();

        dtSearchResults = ls.Search();

        Session["dtSearchResults"] = dtSearchResults;

        Response.Redirect("~/FCCSearch/SearchResults.aspx");
        }
        else
            lblResults.Visible = true;
    }

解决方法

It runs successfully the first time,
but if I run it again,I keep getting
a System.OutOfMemoryException. What
are some reasons this could be
happening?

无论其他人说什么,错误与忘记处理您的DBCommand或DBConnection毫无关系,并且您不会通过处理其中任何一个来解决您的错误。

该错误与您的数据集有关,该数据集包含近60万行数据。显然,您的数据集占用机器可用内存的50%以上。显然,在第一个垃圾回收之前返回另一个相同大小的数据集时,内存不足。就那么简单。

您可以通过以下几种方式解决此问题:

考虑返回较少的记录。我个人无法想象,返回600K记录对用户有用的时间。为了最小化返回的记录,请尝试:

>将您的查询限制为前1000条记录。如果从查询返回超过1000个结果,请通知用户缩小搜索结果范围。
>如果您的用户真的坚持一次看到这么多数据,请尝试分页数据。请记住:Google从未向您显示所有22项宝贵的搜索结果,它一次显示20条记录。 Google可能不会立即将内存中的所有22个百万的结果保留下来,它可能会发现更高的内存效率来重新查询其数据库以生成新的页面。

>如果您只需要遍历数据,而不需要随机访问,请尝试返回一个datareader。数据采集??器一次只能将一个记录载入内存。

如果没有这些选项,则需要强制.NET释放数据集使用的内存,然后使用以下方法之一调用方法:

>删除对您的旧数据集的所有引用。对数据集进行补救的任何东西都将阻止内存回收。
>如果您无法将所有对数据集的引用置空,请清除数据集中的所有行以及绑定到这些行的任何对象。这将删除对数据行的引用,并允许它们被垃圾回收器使用。

我不相信你将需要调用GC.Collect()强制一个循环。调用GC.Collect()通常不是一个坏主意,因为足够的内存压力会导致.NET自己调用垃圾回收器。

注意:在数据集上调用Dispose不会释放任何内存,也不会调用垃圾收集器,也不会删除对数据集的引用。 Dispose用于清理非托管资源,但DataSet没有任何非托管资源。它只实现IDispoable,因为它固有的来自MarshalByValueComponent,所以数据集上的Dispose方法几乎没有用。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读