如何管理系统内存不足异常?



我正在处理大约 3 GB 的数据。它存储在甲骨文数据库中。我的任务是在数据网格视图上列出这些数据。这就是为什么我创建了一个类来存储这些数据,然后我使用这个泛型列表来推送 datagridview 的数据源。尽管如此,在 ram 中处理了大约 1300 行数据后,代码会返回"堆栈内存"异常。程序停止运行。

上传 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;

我希望我的泛型列表在泛型列表被填充后能够正常运行。但是 vshost32.exe 被抛出系统内存异常。

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

我正在处理大约 3 GB 的数据。它存储在甲骨文数据库中。我的任务是在数据网格视图上列出这些数据

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

这就是为什么我创建了一个类来存储这些数据,然后我使用这个泛型列表来推送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. 将数据存储在内存缓存中,并且仅将一两页绑定到数据网格源,缓存更适合此类数据,它可以快速访问,尤其是在您没有耗尽RAM的情况下

大多数情况下,在 64 位进程中,它永远不会内存不足,因为通常没有系统的 RAM 高于 16 ExaBytes,即使只为用户进程分配了一半

最新更新