2017-04-01 68 views
0

在ASP.NET MVC應用程序中,我正在執行xlsx文件中的計算。我們在計算中討論18K變量(xlsx文件大約爲10MB),因此將它們加載到SpreadSheetGear實例中需要一段時間。因此,我需要在請求之間緩存SpreadSheetGear對象,否則每個請求都將永久存在。如何緩存ASP.NET MVC應用程序中的SpreadSheetGear對象?

現在我正在使用進程內應用程序緩存和會話緩存來保存請求之間的數據。在我的測試環境中,IIS的應用程序池比會話超時(我認爲默認的20分鐘)更快地回收(有時僅需幾分鐘)。池回收導致所有In-Proc緩存數據丟失,並且冗長的加載過程必須再次發生。

  1. 據我可以看到沒有函數序列化SpreadSheetGear對象(例如保存爲xlsx格式)。如果我可以序列化它,那麼我可以切換到一個沒有進程的緩存車輛。但即使如此,我還是有點懷疑,與In-Proc內存緩存相比,它會如何執行。
  2. 我想不通爲什麼發生回收。儘管服務器內存不足,但我沒有爲IIS應用程序池設置任何內存限制或虛擬機內存限制。我沒有在IIS日誌中找到回收事件。
  3. 有沒有什麼方法可以避免進程內存數據在應用程序池回收中存活?

有沒有人有類似SpreadSheetGear + ASP.NET MVC + IIS的經驗?

+0

到目前爲止,我們將嘗試使用的是Azure虛擬機,我可以啓動狀態服務器。虛擬機也可以擴展(有一些限制:從可用性組預先設置),如果我可以很好地緩衝非循環,ARR感知負載平衡器,那麼我將是黃金 –

+0

超出過程狀態服務器不'無論如何,這也需要序列化。我們自己希望最好,所以IIS不會決定回收 –

回答

0

我有類似的問題,當多個會話佔用太多的內存。一旦達到閾值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)) 
+0

感謝您的建議。現在我正在進行從客戶端到服務器的定期輪詢,直到會話過期(25分鐘)。但是,到時候不會擴展。 –

相關問題