2017-04-01 3 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アプリケーションプールにメモリ制限またはVMメモリ制限が設定されていません。 IISログにリサイクルイベントが見つかりません。
  3. Appプールのリサイクルに耐えられるようにIn-Procのメモリデータを保護する手段はありますか?

SpreadSheetGear + ASP.NET MVC + IISに似た経験を持っている人はいますか?

+0

私たちがしようとしているのは、Azure VMを使って状態サーバーを起動できるところです。 VMはスケールアウトすることもできます(いくつかの制限があり、可用性グループから事前にプロビジョニングされています)。非ラウンドロビンのARR対応ロードバランサをきれいにシムできるならば、私はゴールデンになります –

+0

State of server does not 'どちらも助けてください。それには直列化も必要です。 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分)まで、クライアントからサーバーへの定期的なポーリングを行っています。しかし、時間が来るとそれはスケールされません。 –

関連する問題