如何缓存ASP.NET MVC应用程序中的SpreadSheetGear对象?
在ASP.NET MVC应用程序中,我正在执行xlsx
文件中的计算。我们在计算中讨论18K变量(xlsx
文件大约为10MB),因此将它们加载到SpreadSheetGear
实例中需要一段时间。因此,我需要在请求之间缓存SpreadSheetGear
对象,否则每个请求都将永久存在。如何缓存ASP.NET MVC应用程序中的SpreadSheetGear对象?
现在我正在使用进程内应用程序缓存和会话缓存来保存请求之间的数据。在我的测试环境中,IIS的应用程序池比会话超时(我认为默认的20分钟)更快地回收(有时仅需几分钟)。池回收导致所有In-Proc缓存数据丢失,并且冗长的加载过程必须再次发生。
- 据我可以看到没有函数序列化SpreadSheetGear对象(例如保存为xlsx格式)。如果我可以序列化它,那么我可以切换到一个没有进程的缓存车辆。但即使如此,我还是有点怀疑,与In-Proc内存缓存相比,它会如何执行。
- 我想不通为什么发生回收。尽管服务器内存不足,但我没有为IIS应用程序池设置任何内存限制或虚拟机内存限制。我没有在IIS日志中找到回收事件。
- 有没有什么方法可以避免进程内存数据在应用程序池回收中存活?
有没有人有类似SpreadSheetGear + ASP.NET MVC + IIS的经验?
我有类似的问题,当多个会话占用太多的内存。一旦达到阈值IIS终止随机会话以释放内存。解决方案是将缓存从CacheItemPriority.Default更改为CacheItemPriority.NotRemovable。这样IIS不会从内存中删除会话,并在超时或会话关闭时会调用CacheItemRemovedCallback()并从内存中删除。
HttpRuntime.Cache.Insert(workbookPath, myWorkbook, Nothing, Cache.NoAbsoluteExpiration, New TimeSpan(0, 0, 1520), CacheItemPriority.NotRemovable, New CacheItemRemovedCallback(AddressOf OnRemoveCallBack))
感谢您的建议。现在我正在进行从客户端到服务器的定期轮询,直到会话过期(25分钟)。但是,到时候不会扩展。 –
到目前为止,我们将尝试使用的是Azure虚拟机,我可以启动状态服务器。虚拟机也可以扩展(有一些限制:从可用性组预先设置),如果我可以很好地缓冲非循环,ARR感知负载平衡器,那么我将是黄金 –
超出过程状态服务器不'无论如何,这也需要序列化。我们自己希望最好,所以IIS不会决定回收 –