我需要显示40,000条记录,我在MVC 5中遇到系统内存不足异常。有时70,000条记录正确加载,有时甚至没有40,000条记录加载。我需要显示所有记录并将这些记录导出到MS-Excel。 我使用kendo网格来显示记录。 我看到某个地方kendo网格没有加载大量的记录。
答案 0 :(得分:0)
来自Telerik forum:
当OpenAccess执行查询时,结果的实际检索将拆分为块。有一个提取大小,用于确定一次传递从数据库中读取的记录数。使用返回大量记录的查询,这意味着不会超过提取大小,并且不会在内存中一次检索所有40 000条记录。迭代结果数据,您将从数据库中获得多次读取,直到迭代结束。但是,当您遍历结果集时,在保留对迭代对象的引用时会累积后续读取。 当您使用网格中的所有记录进行操作时,可能会导致内存不足异常。避免这种错误的方法是使用块中的数据。例如,网格的分页和从所有页面顺序导出数据的选项将实现此目的。目标是尝试减少一次保留在内存中的对象,并让垃圾收集释放不需要的内存。具有Skip()和Take()的LINQ查询在内存中的所有数据都很昂贵的情况下是理想的。
和http://docs.telerik.com/devtools/aspnet-ajax/controls/grid/functionality/exporting/overview
我们强烈建议不要导出大量数据,因为如果有多个用户同时尝试导出相同的数据,则可能会遇到异常(Timeout或OutOfMemory)。 RadGrid不适合这种情况,因此我们建议您限制列数和行数。另外需要注意的是,层次结构和嵌套控件对此方案中的性能有相当大的影响。
上面基本上说的是通过分页减少结果集和/或减少从数据库中提取的列数,以便仅显示实际需要的内容。
不确定你还能做什么。你有太多的数据,而且你的内存不足。必须减少数据以减少使用的内存。
答案 1 :(得分:0)
请进行分页。并尝试导出所有40000条记录,而不会丢失到页面。这样可以清除加载数据需要花费时间并从异常中转移到内存中。