2

在执行创建大量对象的导入过程时,我遇到了 System.OutOfMemoryException。

效果是 ASPNET_WP.EXE 炸到 1.4 GB 并且会抛出异常。

我已经尝试在该负责的函数中实现 IDisposable 并调用垃圾收集器 (GC.Collect()),但没有效果。

服务器是具有 4 GB RAM 的 QuadCore (C2Q)。即使有超过 1.4 GB 的可用 RAM,当 aspnet_wp.exe 达到 1.4 GB 时,总是会引发异常。

我可以做些什么来避免这些 OutOfMemory 问题?

确切的异常消息是:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at
OpenAccessRuntime.DataObjects.PersistenceManagerFactoryBase.
CreatePersistenceMangerImp(StorageManger sm)
at
....
4

3 回答 3

2

一个词:自托管

IIS 在内存处理方面存在局限性和缺陷,如果您的 WCF 服务确实必须在服务器上使用超过 1.4 GB 的内存,那么您需要自己托管该 WCF 服务,在控制台应用程序、NT 服务、 Winforms 应用程序 - 无论您选择哪种方式。

快速的问题:如果处理每个请求将占用 1.4 GB 内存,您的服务器将如何处理 10 个并发请求......

你是想传回文件还是什么?在这种情况下,您应该查看WCF 流,它可以让您大大减少服务器上所需的缓冲内存大小。

马克

于 2009-10-22T05:22:11.887 回答
1

您可以分段导入,而不是快速创建大量对象并处理它们。

您可能想更多地解释发生了什么,您是如何处理导入的。

例如,您可以完全处理并保存每个对象,然后再做另一个对象吗?

你可能想要一个内存分析器。以下是一些开源 c# 分析器: http ://csharp-source.net/open-source/profilers

我会看两件事。

  1. 你能改变你的算法来防止这种情况发生吗?
  2. 获取有关为什么会发生这种情况的更多信息。
于 2009-10-22T01:55:33.957 回答
0

请记住,如果您在 asp.net 中运行,则无法访问所有内存,它仅允许您使用标准配置进行 2gigs。也许您应该将其移植到 Windows 服务或控制台应用程序。

请参阅此处:“事实:在标准设置中,您的工作进程始终有 2GB 可用的虚拟内存(无论您的机器中是否有 1、2 或 4GB 物理内存)。”

http://jesperen.wordpress.com/2007/05/23/understanding-aspnet-memory/

于 2009-10-22T04:06:30.497 回答