【发布时间】:2013-02-18 01:51:29
【问题描述】:
我有一个简单的 asp.net 网站,它将一个大文本文件读入内存并进行一些处理。下面是引发 OOM 异常的代码。在阅读了大约 350k 行之后,我得到了这个错误。每行平均有 1k 个字符。 IIS 或 ASP.Net 网站是否存在内存限制?我的服务器仍然有大量的物理内存。谢谢。
List<string> geos = new List<string>();
using (StreamReader geoReader = new StreamReader(File.OpenRead("file.txt")))
{
while (geoReader.EndOfStream == false)
{
try
{
geos.Add(geoReader.ReadLine());
}
catch (Exception ex) { }
}
}
【问题讨论】:
-
设置 adplus 以在崩溃时捕获内存转储 - 语法类似于:adplus -crash -iis : msdn.microsoft.com/en-us/magazine/cc163833.aspx
-
.NET 中确实存在内存限制。你不能在处理数据之前把数据分成块吗?
-
你可能会弄乱内存限制,但这是一种脆弱的方法,更大的文件,更多的处理更多的内存对象只会用完它。要看的是你需要内存中的所有数据,然后才能对它做任何事情。 OOM是net进程内存不足,而不是你的机器,实际上它即使在收集之后也无法找到一个连续的空闲内存块
-
那你用你的清单做什么?如果源文件有大数据,为什么不使用异步操作对每一行执行操作,而不是将其存储在列表中?
-
无论系统内存如何,如果此操作是为了响应客户端请求,那是一种非常成本高昂的方法。 350 * 1000 * 1000 = 350mb。您是说错误发生在 350,000 行之后,但可能还有更多行?如果 10 个人同时运行同一个请求会发生什么?如果有人厌倦了等待并点击刷新 10 次怎么办? 3.5gig 消失。正如 Alexei 所说,如果您真的需要使用这么多内存,请运行 64 位架构。否则,请考虑重新设计。
标签: c# asp.net out-of-memory streamreader