我正在处理大约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。
您正在处理几个问题,我们将逐一讨论它们:
我正在处理大约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特别不确定,它很快就超越了边界
解决办法是什么 ?
主要是在64位进程中它永远不会内存不足,因为没有系统通常具有比16 ExaBytes更高的RAM,即使只为用户进程分配了一半