【问题标题】:File.ReadAllBytes() throws OutOfMemoryExceptionFile.ReadAllBytes() 抛出 OutOfMemoryException
【发布时间】:2014-07-30 01:41:36
【问题描述】:

我正在将小型 pdf 文件加载到缓冲区中并获取 OutOfMemoryEception。文件大小 220KB 工作正常,我测试的下一个大小是 4,50MB,这个文件抛出异常。最大文件大小是多少,我可以做些什么来更改最大大小? 4,5MB 不算多 :-)

这是相关代码:

ListViewDataItem dataItem = (ListViewDataItem)e.Item;
int i = dataItem.DisplayIndex;
byte[] buffer = File.ReadAllBytes(Session["pdfFileToSplit"].ToString());
string unique = Guid.NewGuid().ToString();
Session[unique] = buffer;

Panel thumbnailPanel = (Panel)e.Item.FindControl("thumbnails");
Thumbnail thumbnail = new Thumbnail();
thumbnail.SessionKey = unique;
thumbnail.Index = i+1;
thumbnail.DPI = 17;
thumbnail.BorderColor = System.Drawing.Color.Blue;
thumbnailPanel.Controls.Add(thumbnail);

好的,我刚刚看到了一些非常神秘的东西(对我来说)。我上传了一个低于 10MB 的文件,并查看了 IIS 服务器的已用内存(w3wp.exe),没有发生任何戏剧性的事情,增加了几 MB,减少了一些,一切正常。比我用 12MB 的文件尝试过同样的事情。一开始看起来是一样的,但是突然之间,w3wp.exe 的已用内存突然激增到 1.5GB,然后服务器崩溃了......

【问题讨论】:

  • 我正在使用一个组件,该组件需要将文件保留在会话中 tallcomponents.com/pdfthumbnail.aspx
  • 我不知道这个组件。无论哪种方式,会话状态都不是为了保存大量数据而构建的。您应该重新考虑将缩略图写入临时文件,并且只在会话中保留这些文件的路径。

标签: c# asp.net out-of-memory


【解决方案1】:

OutOfMemoryException 是在服务器端还是客户端?

当您使用Session[unique] = buffer 时,您将在会话中同时存储所有文件(表示为字节数组)。

这可能是很多信息。

如果您的会话是“InProc”,您的服务器可能会耗尽内存。

限制是机器的内存。

当您的请求完成时,内存仍会在会话中分配。那就是问题所在。如果这不是所需的行为,则应设置 Session[unique] = null ,使会话在服务器上释放内存。如果您放置 10 个文件,即使在请求完成后,会话中也会同时存储 10 个文件。它们只会在会话结束时被释放。

【讨论】:

  • 我正在使用 TallComponent.pdf.thumbnail 并且有必要将它存储在会话中,因为没有其他方法 afaik。例外是服务器端,但双方,客户端和服务器,确实有足够的内存来处理 4,5MB
  • 我已经编辑了答案,补充了您的问题。我知道这是组件的行为,但会话的行为是我所描述的。如果你这样放一百个文件,它们都将存储在内存中(在服务器内存中)。
  • 好的,谢谢,现在 4.5MB 可以正常工作,但 >10MB 仍然会引发异常。可能 Visual Studio asp.net 开发服务器有什么限制?
  • 您能否在任务管理器中检查为 VS DEV 服务器和状态服务器 (aspnet_state.exe) 分配了多少内存?如果您不想更改您的架构(我确实通过这条路径),您可以考虑使用另一种存储会话值的方式(例如数据库)。可能消耗大量内存的进程是 aspnet_state.exe。
  • WebDev 服务器目前为 107.7MB。 aspnet_state.exe 没有运行。
猜你喜欢
  • 2015-02-28
  • 2014-09-20
  • 1970-01-01
  • 2013-03-08
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多