Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何管理systemoutofmemory异常?_C#_Winforms_Memory Management_Out Of Memory_Stack Overflow - Fatal编程技术网

C# 如何管理systemoutofmemory异常?

C# 如何管理systemoutofmemory异常?,c#,winforms,memory-management,out-of-memory,stack-overflow,C#,Winforms,Memory Management,Out Of Memory,Stack Overflow,我正在处理大约3 gb的数据。它存储在Oracle数据库中。我的任务是在datagridview上列出这些数据。这就是为什么我创建了一个类来存储这些数据,然后我使用这个genericList来推送datagridview的数据源。然而,在ram中处理了大约1300行数据后,代码返回stackoutofmemory异常。程序停止运行 在上传了1300MB的数据后,我试图清除genericList数据,并使用垃圾收集清除ram中的数据。但它不起作用。vshost32.exe仍在增加 var data

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

在上传了1300MB的数据后,我试图清除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;

我希望我的genericlist在填充genericlist后能够正常运行。但是vshost32.exe被抛出systemoutofmemory异常。

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

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

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

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

大多数数据结构(如datagridview的datasource)都有内部限制,它们并不打算存储如此庞大的数据,这会破坏数据结构或使性能非常差

在上传了1300MB的数据后,我试图清除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;
这里有几点,不确定您是如何在1300 MB时清除数据的,但您肯定使用的是32位进程,它的用户限制为2 GB,因此超出了该限制。剩余的2GB用于内核进程,用户进程可以将其最大值调整为3GB,但通常情况下,您要处理的是数据结构的内部限制,或者完全是您的假设,您需要清除任何内存,因为GC特别不确定,它会很快越过边界

解决办法是什么

在64位系统上使用64位进程,这将确保内存不足异常消失,因为现在的内存限制为2^64字节=16 EB。您可以确保进程/二进制文件是64位兼容的 将数据存储在内存缓存中,并仅将一两页绑定到数据网格源,缓存更适合此类数据,尤其是在RAM未用完的情况下,它可以快速访问
大多数情况下,在64位进程中,内存永远不会用完,因为没有系统的RAM通常高于16 EB,即使只有一半分配给用户进程

为什么需要在RAM/列表中加载3 GB的数据?你到底想达到什么目的?也许我们可以找到更好的解决办法。请记住,清除列表@XXXmb可能会为您解决问题,但可能会在规格较低、内存较少的设备上导致相同的问题。实际上,我对硬件没有任何限制。我使用的是16gb Ram和500gb SSD。我认为我的硬件运行起来很容易。但不知何故,VisualStudio将系统排除在外。我不明白。但是你为什么要这么做呢?saied列表中实际存储的是什么?因为我需要在datagridview上使用3GB。我将在datagridview的顶部添加一些过滤器属性。我将处理datagridview上的数据,例如更新、删除或插入。但我想查看datagridview中的所有数据。否则我就无法处理数据。DataGridView从未被设计来处理如此庞大的数据量。我严重怀疑你是否真的需要一次在内存中存储所有3GB的数据。gc甚至会接触数据吗?有一个参考,所以它不会收集它,我想。如果我错了,请纠正我。另外,据我所知,手动调用垃圾收集器是一种不好的做法,不是吗?@DenisSchaf假设数据仍然被引用,GC不能接触它,但让我们假设OP释放它,GC仍然是不确定的,即使显式使用GC API,在内存即将打开时,GC可能没有时间投入,GC无法进行优化,系统也无法抛出异常。理想情况下,gcapi用于测试系统,用于显式等待挂起的终结器或生成集合,但不用于生产代码。我们最多可以使用工作站或服务器GC,这是一种配置