如何管理系统outofmemoryexception?

问题描述 投票:-1回答:1

我正在处理大约3 GB的数据。它存储在Oracle数据库中。我的任务是在datagridview上列出这些数据。这就是为什么我创建了一个存储这些数据的类,然后我使用这个genericList来推送datagridview的数据源。然而,在ram中处理了大约1300行数据后,代码返回“stackoutofmemory”异常。程序停止运行。

在上传了1300 mb的数据后,我尝试清除genericList数据,并使用垃圾收集来清除ram中的数据。但它没有用。 vshost32.exe仍然增加了。

var dataList = cmd=........... // get dataList from DB
list<class> dataList2 = new list<class>();

foreach(var data in dataList) {
     dataList2.add(new class{
    ...........//fill the DataList2
});

datagridview.datasource = datalist2;

我希望我的通用列表在填充通用List后能够正常运行。但是vshost32.exe被抛出系统outofmemoryexception。

c# winforms memory-management out-of-memory stack-overflow
1个回答
1
投票

您正在处理几个问题,我们将逐一讨论它们:

我正在处理大约3 GB的数据。它存储在Oracle数据库中。我的任务是在datagridview上列出这些数据

首先,没有人可以一次性审查3 GB数据,这就是为什么它总是在部分中看到,这就是为什么数据被分页以提供有限的页面视图

这就是为什么我创建了一个存储这些数据的类,然后我使用这个genericList来推送datagridview的数据源

像datagridview的数据源这样的大多数数据结构都有内部限制,它们并不意味着存储这些巨大的数据,它会破坏数据结构或使性能很差

在上传了1300 mb的数据后,我尝试清除genericList数据,并使用垃圾收集来清除ram中的数据。但它没有用。 vshost32.exe仍然增加了。

这里有几点,不知道你是如何清除数据@ 1300 MB,但你肯定使用32位进程,其用户限制为2 GB,因此OOM超过了该限制。剩余的2 GB用于内核进程,对于用户进程,您可以调整为最大3 GB,但通常您正在处理数据结构的内部限制,或者纯粹是您假设清除任何内存,因为GC特别不确定,它很快就超越了边界

解决办法是什么 ?

  1. 在64位系统上使用64位进程,这将确保内存不足异常消失,因为内存限制现在是2 ^ 64字节= 16 ExaBytes。您可以确保进程/二进制文件是64位兼容的
  2. 将数据存储在内存缓存中并仅将一两页绑定到数据网格源,Cache更适合此类数据,特别是如果您没有RAM,则可以快速访问

主要是在64位进程中它永远不会内存不足,因为没有系统通常具有比16 ExaBytes更高的RAM,即使只为用户进程分配了一半

© www.soinside.com 2019 - 2024. All rights reserved.